我正在尝试使用分层渲染一次渲染阴影立方体贴图。
我试图尽可能彻底:
- 我使用 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(点)阴影贴图):