1

単純なパススルージオメトリシェーダーを作成しようとしていますが、

glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL);

しかし、それはで動作します

glDrawArrays(GL_TRIANGLES, 0, foo_INDEX);.

ジオメトリシェーダーは..

#version 400
#extension GL_EXT_geometry_shader4 : enable

layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;

void main() {
  for(int i = 0; i <  gl_VerticesIn; i++) {
    gl_Position = gl_PositionIn[i];
    EmitVertex();
  }
  EndPrimitive();
}

それで、誰かがこのジオメトリシェーダーがdrawArraysで動作し、drawElementsで動作しない理由を知っていますか?お願いします。

4

1 に答える 1

12

あなたは非常に混乱し、紛らわしいジオメトリ シェーダーを作成しました。

最初の行は、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();
}

これで問題が解決するかどうかはわかりませんが、これらシェーダーの問題です。

于 2012-07-20T18:58:23.417 に答える