以前に発生して投稿した問題と多少似ているため、GLSLアプリで法線を正しく表示しようとしています。説明のために、RenderMonkeyで提供されているninjaHead.objモデルをテスト目的で使用しています(ここで取得できます)。これで、RenderMonkeyのプレビューウィンドウでは、すべてが見栄えが良く
なります。生成される頂点コードとフラグメントコードはそれぞれ次のとおりです。
バーテックス:
uniform vec4 view_position;
varying vec3 vNormal;
varying vec3 vViewVec;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// World-space lighting
vNormal = gl_Normal;
vViewVec = view_position.xyz - gl_Vertex.xyz;
}
断片:
uniform vec4 color;
varying vec3 vNormal;
varying vec3 vViewVec;
void main(void)
{
float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal));
gl_FragColor = v* color;
}
私はこれに基づいてGLSLコードを作成しましたが、期待した結果が得られていません...
私の頂点シェーダーコード:
uniform mat4 P;
uniform mat4 modelRotationMatrix;
uniform mat4 modelScaleMatrix;
uniform mat4 modelTranslationMatrix;
uniform vec3 cameraPosition;
varying vec4 vNormal;
varying vec4 vViewVec;
void main()
{
vec4 pos = gl_ProjectionMatrix * P * modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * gl_Vertex;
gl_Position = pos;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
vec4 normal4 = vec4(gl_Normal.x,gl_Normal.y,gl_Normal.z,0);
// World-space lighting
vNormal = normal4*modelRotationMatrix;
vec4 tempCameraPos = vec4(cameraPosition.x,cameraPosition.y,cameraPosition.z,0);
//vViewVec = cameraPosition.xyz - pos.xyz;
vViewVec = tempCameraPos - pos;
}
私のフラグメントシェーダーコード:
varying vec4 vNormal;
varying vec4 vViewVec;
void main()
{
//gl_FragColor = gl_Color;
float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal));
gl_FragColor = v * gl_Color;
}
しかし、私のレンダリングはこれを生成します...
何がこれを引き起こしているのか、そして/またはそれを機能させる方法を誰かが知っていますか?
編集
kvarkのコメントに応えて、レンダリングされているすべての三角形を表示するために、通常/照明の計算なしでレンダリングされたモデルがあります。
これが、色に使用される法線を使用したモデルのシェーディングです。問題が見つかったと思います!その理由は、なぜこのようにレンダリングされているのか、そしてそれをどのように解決するのかということです。提案は大歓迎です!
解決策 さて、誰もが問題を解決しました!プログラミングの練習に間違いなく役立った彼の有益な洞察に感謝しますが、答えは私が大規模な乳首であることから来るのではないかと思います...コードのdisplay()関数にエラーがあり、glNormalPointerオフセットを設定しましたランダムな値に。以前はこれでした:
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getNormalsBufferObject());
gl.glNormalPointer(GL.GL_FLOAT, 0, getNormalsBufferObject());
しかし、これである必要があります:
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getNormalsBufferObject());
gl.glNormalPointer(GL.GL_FLOAT, 0, 0);
ですから、これは教訓だと思います。金曜日の午後の時間を節約するために、Ctrl+CおよびCtrl+Vコードを無意識に使用しないでください。そして...あなたが見ているコードの部分が正しいと確信している場合、問題はおそらくどこか別の場所にあります。