1

ポイントの配列をプログラム可能なパイプラインに渡して立方体を描画する非常に単純なプログラムを使用しています。フレームごとに(外部入力に基づいて)ジオメトリを変更できるように設定しようとしています。そのため、照明については、変更後に顔の法線を再計算する必要があります。演習としてジオメトリ シェーダーで実行しています。

私のシェーダーは次のとおりです。

バーテックス:

#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' の値は赤、緑、白、黒の間で反転していますが、理由はわかりません。フラグメント シェーダーで単純にカラー ベクターを指定すると、立方体はどこでもそのカラーで適切にレンダリングされます。

通常の値がまったく変化するのはなぜですか?

考え?

4

1 に答える 1

4

の値normalundefinedです。

を呼び出すたびに、すべてのジオメトリ シェーダー出力に書き込む必要があります。GS は即時モード レンダリングのようには機能しません。EmitVertex

于 2013-05-10T02:31:48.913 に答える