ポイントの配列をプログラム可能なパイプラインに渡して立方体を描画する非常に単純なプログラムを使用しています。フレームごとに(外部入力に基づいて)ジオメトリを変更できるように設定しようとしています。そのため、照明については、変更後に顔の法線を再計算する必要があります。演習としてジオメトリ シェーダーで実行しています。
私のシェーダーは次のとおりです。
バーテックス:
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
}
ジオメトリ:
#version 330
precision highp float;
layout (triangles) in;
layout (triangle_strip) out;
layout (max_vertices = 3) out;
out vec3 normal;
void main(void)
{
for (int i = 0; i < gl_in.length(); i++) {
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
normal = vec3(0,0,1);
}
断片:
#version 330
in vec3 normal;
out vec4 color;
void main()
{
color = vec4(normal,1);
}
私は法線を計算しようとしていましたが (デバッグの理由でそのコードを取り出しました)、プログラムを実行したときに法線値がおかしくなりました。そこで、フラグメントの色を通常の値に設定しました。(それが実際に法線であったかどうかを確認するためです。) したがって、何らかの理由で、'normal' の値は赤、緑、白、黒の間で反転していますが、理由はわかりません。フラグメント シェーダーで単純にカラー ベクターを指定すると、立方体はどこでもそのカラーで適切にレンダリングされます。
通常の値がまったく変化するのはなぜですか?
考え?