6

変更を試みる前に頂点を通過する単純なジオメトリシェーダーを作成しようとしています。

私の頂点シェーダーは

#version 150 core
in vec3 inPosition;
in vec4 inColor;

out vec4 vertexColor;

void main() {
    vertexColor = inColor;
    gl_Position = vec4(inPosition, 1.0);
}

私のジオメトリシェーダーは

#version 150 core
layout (triangles) in;
layout (triangle_strip,  max_vertices=3) out;

void main() {
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();

    gl_Position = gl_in[1].gl_Position;
    EmitVertex();

    gl_Position = gl_in[2].gl_Position;
    EmitVertex();
    EndPrimitive();
}

そして私のフラグメントシェーダーは

#version 150 core
in vec4 vertexColor;
out vec4 fragColor;

void main() {
    fragColor = vertexColor;
}

リンクされたジオメトリシェーダーがないと、すべてが正常に機能します。ただし、ジオメトリシェーダーでリンクすると、機能しなくなります。私が行方不明になっているのは何ですか?ジオメトリシェーダーにはvertexColor頂点シェーダーからの入力が必要ですか?必要な場合、それはどのように行われますか?

4

1 に答える 1

7

私のジオメトリシェーダーは、そのページにリストされているものとまったく同じです

はい。ただし、補完的な頂点シェーダーとフラグメントシェーダーはそうではありません

情報は次のようにOpenGLパイプラインを流れます。最初に、頂点シェーダーがデータを取得します。存在する場合は、出力をジオメトリシェーダーに渡します。ジオメトリシェーダーは、その出力をフラグメントシェーダーに渡します(もちろん、通常の三角形のラスタライズの後)。そして、フラグメントシェーダーはその出力をブレンドステージに渡します。

頂点シェーダーには、、、の2つの出力gl_PositionがありvertexColorます。ただし、ジオメトリシェーダーは1つの入力のみを取りますgl_in[0].gl_Position。これはGLSLでは無効です。1つのステージが値を出力する場合、次のステージがそれを入力する必要があります。gl_Position唯一の例外は、ラスタライザーによって消費されるのようなGLSL定義の値です。

パススルーGSでデータをパススルーする場合は、実際にデータをパススルーする必要があります。GSで適切な入力を行う必要があります。

in vec4 vertexColor[];

ただし、GLSLのグローバル変数に同じ名前を付けることはできません。vertexColorしたがって、入力および出力として受け取ることはできません。したがって、代わりに、出力の名前を変更する必要があります(またはインターフェイスブロックを使用します)。

out vec4 gsColor;

これで、フラグメントシェーダーがそれを取得して処理する必要がありin vec4 gsColor;ます。

これらのシェーダーをリンクしようとすると、コンパイラーは不一致について説明する適切な情報ログを提供するはずです。シェーダーがリンクに失敗したときに情報ログを取得していますか?そうでない場合は、する必要があります。

于 2012-01-12T20:51:42.980 に答える