0

私は現在 OpenGL フレームワークに取り組んでおり、最近.ply(Polygon File Format) メッシュ インポーターを作成しました。インポーターが機能しているので、インポートしたメッシュでシンプルなライティング シェーダーを試してみたかったのですが、問題が発生しています。

メッシュは、 Stanford 3D Scanning Repositoryから取得した有名な Stanford Bunny の低解像度バージョンであり、最初に Blender にインポートして正確性を確認し、次にとではなくnX, nY, nZ値を取得するためにもう一度エクスポートしました。このファイルはhttp://pastebin.com/raw.php?i=xRmLYN0sにあります。confidenceintensity

何が起こっているかというと、ライティング シェーダーは、カメラの向きに基づいて色を変えるフラット シェーダーのように動作します。画像はこの投稿の最後に含まれています。

シェーダーは 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::NORMAL2glBindAttribLocation

私が知る限り、法線はファイルからシェーダーに正しく渡されているはずです。しかしvFragColor.rgb = vNormal.xyz、頂点シェーダーを設定すると、バニーは真っ赤になります。それは良くないですよね?

では、シェーダーが機能しない理由はありますか? 悪いですか?ノーマルが抜けていませんか?他の何か?

ご協力いただける場合は、何卒よろしくお願いいたします。さらに情報が必要な場合は、お知らせください。


画像

うさぎの周りを回転する:

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

設定vFragColor.rgb = vNormal.xyz;

ここに画像の説明を入力

Blenderでモデル化(正しさの確認)

ここに画像の説明を入力

4

1 に答える 1

2

問題は属性バインディングにありました。どういうわけか、シェーダー パーサーで、読み取り中の実際のコード行と、大文字と小文字を区別しない比較チェックのためにすべて大文字に設定された行とを区別するのを忘れていました。

これにより、GLSL_ATTR::NORMALインデックスが にバインドされVNORMALましたvNormal。奇妙なことに、この問題は、位置/色/テクスチャの作業中に発生することはありませんでした。単なるばかげたタイプミスだったこの問題を解決しようとしてくれた @Tim に感謝します。

最後に、うさぎは意図したとおりに点灯しました。

ここに画像の説明を入力

于 2012-08-16T01:12:24.010 に答える