あなたは非常に混乱し、紛らわしいジオメトリ シェーダーを作成しました。
最初の行は、GLSL バージョン 4.00 を使用していることを示しています。この言語には、コア機能としてジオメトリ シェーダーがあります。拡張子は必要ありません。次に、2 行目で EXT_geometry_shader4拡張機能を有効にします。
この問題は、コア ジオメトリ シェーダーと EXT_geometry_shader4 が非常に異なるものであるという事実から生じます。
たとえばgl_VerticesIn
、コア ジオメトリ シェーダーにはありません。layout() in;
取得する頂点の数は、ステートメントによって定義されます。を使用triangles
したので、答えは 3 です。 を使用して見つけることもできます。gl_in.length()
ここgl_in
で、 は既定の頂点入力値を含むインターフェイス ブロック配列です。同様に、gl_PositionIn
コア ジオメトリ シェーダーには存在しません。あなたが使用しますgl_in[index].gl_Position
。
したがって、ジオメトリ シェーダー コードは EXT_geometry_shader4 用に設計されているようです...次の行を除きます。
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
これらは純粋なコア ジオメトリ シェーダーです。EXT_geometry_shader4 では、これらのパラメーターはシェーダー自体ではなく、リンク時に OpenGL コードで指定されます。
そのため、コンパイラの半分で EXT バージョンを使用し、半分でコア バージョンを使用することで、コンパイラを完全に混乱させました。
あなたがやろうとしていることの適切なコアバージョンは次のようになります:
#version 400
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
void main() {
for(int i = 0; i < 3; i++) { // You used triangles, so it's always 3
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
これで問題が解決するかどうかはわかりませんが、これらはシェーダーの問題です。