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(点)阴影贴图):

4

0 回答 0