Многоуровневая отрисовка теневой карты куба

Я пытаюсь сделать теневую кубическую карту за один проход, используя многоуровневую визуализацию.

Я старался быть максимально тщательным:

  • Я связал кубическую карту как вложение глубины (GL_DEPTH_ATTACHMENT_32F), так и вложение цвета 0 (GL_R32F), используя glFramebufferTexture
  • Я удостоверился, что после того, как текстуры прикреплены к FBO, проверена ли полнота кадрового буфера — это завершено
  • Я пробовал оба экземпляра геометрического шейдера, используя «layout (треугольники, invocations = 6) в;» и без (прибегая к 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 (точечными) теневыми картами):

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]