我正在尝试使用立方体贴图计算阴影。为了生成这些,我使用了分层渲染,这样我就可以一次生成立方体贴图。我很想附上一些代码,但它是完整的 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 不完整(是因为渲染缓冲区不是分层渲染友好的吗?)。
最后一个问题:有人告诉我,将分层渲染到立方体贴图中存在一个错误。有关系吗?是否有此类错误的链接?