私は現在 OpenGL フレームワークに取り組んでおり、最近.ply
(Polygon File Format) メッシュ インポーターを作成しました。インポーターが機能しているので、インポートしたメッシュでシンプルなライティング シェーダーを試してみたかったのですが、問題が発生しています。
メッシュは、 Stanford 3D Scanning Repositoryから取得した有名な Stanford Bunny の低解像度バージョンであり、最初に Blender にインポートして正確性を確認し、次にとではなくnX, nY, nZ
値を取得するためにもう一度エクスポートしました。このファイルはhttp://pastebin.com/raw.php?i=xRmLYN0sにあります。confidence
intensity
何が起こっているかというと、ライティング シェーダーは、カメラの向きに基づいて色を変えるフラット シェーダーのように動作します。画像はこの投稿の最後に含まれています。
シェーダーは OpenGL Super Bible からのもので、次のように説明されていSimple diffuse, directional, and vertex based light
ます。
バーテックス
#version 140
uniform mat4 mvMatrix;
uniform mat4 pMatrix;
uniform vec4 vColor;
in vec4 vVertex;
in vec3 vNormal;
out vec4 vFragColor;
void main( void )
{
mat3 mNormalMatrix;
mNormalMatrix[0] = mvMatrix[0].xyz;
mNormalMatrix[1] = mvMatrix[1].xyz;
mNormalMatrix[2] = mvMatrix[2].xyz;
vec3 vNorm = normalize(mNormalMatrix * vNormal);
vec3 vLightDir = vec3(0.0, 0.0, 1.0);
float fDot = max(0.0, dot(vNorm, vLightDir));
vFragColor.rgb = vColor.rgb * fDot;
vFragColor.a = vColor.a;
gl_Position = ( pMatrix * mvMatrix ) * vVertex;
}
断片
#version 140
in vec4 vFragColor;
void main( void )
{
gl_FragColor = vFragColor;
}
これは法線の問題でしょうか?それらがモデル ファイルから適切に抽出され、VAO にフィードされることを確認しました。
glBindVertexArray( m_VAO );
glEnableVertexAttribArray( ToolBox::Math::GLSL_ATTR::NORMAL );
glBindBuffer( GL_ARRAY_BUFFER, m_NormalBuffer );
glBufferData( GL_ARRAY_BUFFER, sizeof( GLfloat ) * num_elements, normals, GL_STATIC_DRAW );
glVertexAttribPointer( ToolBox::Math::GLSL_ATTR::NORMAL, 3, GL_FLOAT, GL_FALSE, 0, ( const GLvoid* )0 );
glBindVertexArray( 0 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
これは、空間 (x、y、z) 情報に使用されるのと同じ VAO であり、以前は色とテクスチャの値に使用されていました。また、シェーダーはカスタム ShaderManager クラスによって解析され、属性は上記のスニペットの通常のバッファーと同じインデックス (別名)vNormal
にバインドされていることが確認されています。ToolBox::Math::GLSL_ATTR::NORMAL
2
glBindAttribLocation
私が知る限り、法線はファイルからシェーダーに正しく渡されているはずです。しかしvFragColor.rgb = vNormal.xyz
、頂点シェーダーを設定すると、バニーは真っ赤になります。それは良くないですよね?
では、シェーダーが機能しない理由はありますか? 悪いですか?ノーマルが抜けていませんか?他の何か?
ご協力いただける場合は、何卒よろしくお願いいたします。さらに情報が必要な場合は、お知らせください。
画像
うさぎの周りを回転する:
設定vFragColor.rgb = vNormal.xyz;
Blenderでモデル化(正しさの確認)