私は持っています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();
}