レイヤード レンダリングを使用して、1 つのパスでシャドウ キューブマップをレンダリングしようとしています。
私は可能な限り徹底的にしようとしました:
- glFramebufferTexture を使用して、深度アタッチメント (GL_DEPTH_ATTACHMENT_32F) とカラー アタッチメント 0 (GL_R32F) の両方のキューブマップをバインドしました。
- テクスチャが FBO にアタッチされたら、フレーム バッファの完全性が完全であるかどうかを確認しました。
- 「layout(triangles, invocations=6) in;」を使用して、両方のジオメトリ シェーダーのインスタンス化を試みました。およびなし (for(int layer=0;layer<6;++layer) ループに頼り、gl_Layer = l を設定し、最初に各プリミティブに対して、次に各頂点に対して)
簡単に言えば、最初のレイヤー (つまり、この場合は X+) がレンダリングされますが、深度や色のアタッチメントなど、他のレイヤーはレンダリングされません。
階層化されたレンダリングに関するドキュメントはかなりまばらなようです。赤い本でさえ、せいぜい半分のページしか費やしていません...とにかく:
コード :
シェーダー :
バーテックス :
#version 440 core layout(location = 0) in vec3 attrPosition; void main() { gl_Position = vec4(attrPosition, 1.0); }
ジオメトリ :
#version 440 core layout(triangles, invocations = 6) in; layout(triangle_strip, max_vertices = 18) out; uniform mat4 dkModelMatrix; uniform mat4 dkViewMatrices[6]; uniform mat4 dkProjectionMatrix; void main() { gl_Layer = gl_InvocationID; for(int i = 0; i < 3; ++i) { gl_Layer = gl_InvocationID; gl_Position = dkProjectionMatrix * dkViewMatrices[gl_InvocationID] * dkModelMatrix * gl_in[i].gl_Position; EmitVertex(); } EndPrimitive(); }
フラグメント :
#version 440 core layout(location = 0) out vec4 dkFragCoord; void main() { dkFragCoord = vec4( vec3(float(gl_Layer) * 0.1 + 0.5) , 1.0); }
C++ (主に私のエンジンのクラスを使用します。これは実際に最低限のことを行い、FBO の場合は 2D (スポット) シャドウマップで既にテストされています):
シャドウマップ関連の変数の作成: https://gist.github.com/xtrium-lnx/77d8989b3c2370607cfc
シャドウマップのレンダリング: https://gist.github.com/xtrium-lnx/387b97c077525be60bb4