分层渲染到立方体贴图

时间:2015-01-09 09:50:58

标签: opengl haskell shadow-mapping

我正在尝试使用立方体贴图计算阴影。为了生成这些,我使用分层渲染,以便我在一次传递中生成立方体贴图。我想附上一些代码,但是我用自己的引擎来完整的Haskell,不确定它是个好主意。但是,这是GLSL代码:

lightCubeDepthmapVS :: String
lightCubeDepthmapVS = unlines
  [
    "#version 330 core"

  , "layout (location = 0) in vec3 co;"
  , "layout (location = 1) in vec3 no;"

  , "uniform mat4 model;"

  , "void main() {"
  , "  gl_Position = model * vec4(co,1.);"
  , "}"
  ]

-- The geometry shader is used because we’re doing a layered rendering in order
-- to generate the whole cube depthmap in one pass. Each primitive (i.e.
-- triangle) gets duplicate 6 times; one time per cubemap face.
lightCubeDepthmapGS :: String
lightCubeDepthmapGS = unlines
  [
    "#version 330 core"

  , "layout (triangles) in;"
  , "layout (triangle_strip, max_vertices = 18) out;"

  , "out vec3 gco;"

  , "uniform mat4 ligProjViews[6];" -- 6 views

  , "void main() {"
  , "  for (int i = 0; i < 6; ++i) {"
  , "    for (int j = 0; j < 3; ++j) {"
  , "      gl_Layer = i;"
  , "      gco = gl_in[j].gl_Position.xyz;"
  , "      gl_Position = ligProjViews[i] * gl_in[j].gl_Position;"
  , "      EmitVertex();"
  , "    }"
  , "    EndPrimitive();"
  , "  }"
  , "}"
  ]

lightCubeDepthmapFS :: String
lightCubeDepthmapFS = unlines
  [
    "#version 330 core"

  , "in vec3 gco;"
  , "out vec4 frag;"

  , "uniform vec3 ligPos;"
  , "uniform float ligIRad;"

  , "void main() {"
  , "  frag = vec4(length(gco - ligPos) * ligIRad);"
  , "}"
  ]

ligIRad是光半径的倒数。因此,得到的地图(它不是标准深度图)存储[0; 1]中6个面的每个像素的距离光点,其中0 = 0且1 =光的半径。这个技巧使我能够用(1,1,1,1)清除色彩图,然后在光照阶段使用立方体贴图,只需使用传统方向获取纹素,并将获取的.r值乘以半径光恢复世界空间距离。

但是,我有一个黑色立方体贴图。我将颜色(R)立方体贴图和我不使用的深度立方体贴图附加到FBO。我认为附加一个渲染缓冲区导致FBO不完整(是因为渲染缓冲区不是分层渲染友好的吗?)。

最后一个问题:我被告知在分层渲染到立方体贴图时存在一个错误。它有关系吗?是否有这种错误的链接?

0 个答案:

没有答案