延迟渲染中的阴影贴图投影(OpenGL 3.3)

时间:2013-02-24 05:41:20

标签: opengl deferred-rendering shadow-mapping

我有一个工作的G缓冲区(颜色,法线,深度),对于每个聚光灯,我都有从光线的角度来看深度图。问题出在照明地图阶段,我无法让它发挥作用。你能指出这里的问题是什么吗?

以下是我对该过程的“理解”:

1. Pass the G-buffer depth map to the lighting shader
2. Pass the light's depth map to the lighting shader
3. For each pixel in the G-buffer depth map:
    3.1. Get the depth value from the texture
    3.2. Convert the X and Y coordinates from texture space to clip space
        3.2.1. pos.x = texcoord.x * 2.0 - 1.0;
        3.2.2. pos.y = -(texcoord.y * 2.0 - 1.0);
    3.3. Set pos.w to 1
    3.4. Multiply the position by inverse view projection matrix to get the world space coordinate
    3.5. Divide the new coordinates by w to "correct" the coords
    3.6. Multiply the coordinates by light's view matrix
    3.7. Change the coordinates from clip space to texture space
    3.8. Compare the Z value of the pixel to the depth value in the light's depth map
    3.9. If pos.z > depthmap.z, the pixel is in shadow

1 个答案:

答案 0 :(得分:1)

这个过程实际上恰恰相反。您不会将纹理坐标转换为剪辑空间,而是将坐标从剪辑空间转换为纹理。为此,你需要将光照相机和投影传递给片段着色器(并且至少在OpenGLES 2.0中将位置从顶点着色器传递到片段着色器,不知道OpenGL 3.3)。

  • 通过相机和投影相乘位置,您将获得灯光视图中的位置。
  • 将xyz除以w,您将获得光照视图剪辑空间中的位置。
  • 将x和y乘以0.5并加0.5,您将获得阴影贴图的uv坐标。

现在你可以从紫外线的阴影贴图中读取深度,并将其与像素的深度进行比较。