2

私は持っていますGL_TEXTURE_2D_ARRAY、そして私はこれをします:

1.FBOしたいものすべてをテクスチャ配列にレンダリングします

2.レンダリングの「メインステージ」でその配列をサンプリングします

gl_Layer最初の目標を達成するために、各プリミティブへの呼び出しを含む小さなジオメトリシェーダーを追加しました。また、レンダリングの第2段階で使用するシェーダーに、このNvidiaチュートリアルに似た「変換」機能をいくつか実装しました。

だから、私の問題は何ですか:

条件:同じ頂点、同じFBO、同じシェーダー、同じテクスチャ配列

1)glFramebufferTextureLayer呼び出しを使用してFBOでレンダリングターゲットを複数回再バインドすると、正常に機能します。

2)テクスチャ配列を名前として保存し、値をglFramebufferTexture変更するだけgl_Layerで予期しない動作が発生します(最初のレイヤー(コードでは0)は正しく、次にレンダリングしようとするすべてのレイヤーは無効です)。

3)したくない1)、したい2)それ、どうやったら出来るの?

FBOをレンダリングするときに使用するシェーダー。

//頂点シェーダー

#version 150 core

uniform mat4 orthoView;
in vec4 in_Position;

void main(void) { 
    gl_Position = orthoView * in_Position; 
}

//ジオメトリ

#version 150 core

uniform int lr;

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

void main(void){
//pass-thru!
for(int i=0; i<3; i++)
  {
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }
gl_Layer = lr;
EndPrimitive();
}

//フラグメントは空です

編集:

助けてくれたみんなに感謝します!これで問題は解決しました。これが私のジオメトリシェーダーです。

#version 150 core

uniform int lr;

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

void main(void){
//pass-thru!
for(int i=0; i<3; i++)
  {
    gl_Layer = lr;
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }

EndPrimitive();
}
4

2 に答える 2

3

これまで実際にgl_Layerを使用したことはありませんが、ドキュメントを見ると、頂点ごとの属性のように聞こえます(これは奇妙です...)。

 The actual layer used will come from one of the vertices in the primitive being shaded

では、EmitVertexの前に、forループ内で値を設定してみてください。

于 2013-01-25T17:10:05.320 に答える
3

gl_Layerすべてのジオメトリシェーダー出力と同様に、頂点ごとの出力です。特定のプリミティブのレイヤーを制御する頂点は、実装によって定義されます。EmitVertexあなたの場合、呼び出しの前にループに設定しない理由はありません。

于 2013-01-25T20:42:12.920 に答える