如何为多点光源使用单个阴影贴图?

时间:2012-03-12 02:15:30

标签: graphics 3d rendering shadow-mapping

据我了解,阴影贴图是通过从灯光的角度渲染场景来创建深度贴图来完成的。然后,您从摄像机的POV重新渲染场景,并为场景中的每个点(GLSL中的片段)计算从那里到光源的距离;如果它与阴影贴图中的相匹配,那么它就在光线下,否则它就在阴影中。

我只是通过this tutorial阅读,以了解如何使用点/全向光进行阴影贴图。

根据第12.2.2节,它说:

  

我们为所有光源使用单个阴影贴图

然后根据12.3.6说:

  

1)计算从当前像素到光源的平方距离   ...
  4)将计算出的距离值与获取的阴影贴图值进行比较,以确定我们是否处于阴影中。

这与我上面所说的大致相同。

我不知道的是,如果我们将所有灯光都烘焙到一张阴影贴图中,那么我们需要将哪些光线与距离进行比较?烘焙到地图上的距离不应该与任何东西相对应,因为它是所有灯光的混合物,不是吗?

我确定我错过了什么,但希望有人可以向我解释这一点。


另外,如果我们使用单个阴影贴图,我们如何将它与所有光源混合?

对于单个光源,阴影贴图只存储最近物体与光线的距离(即深度图),但对于多个光源,它包含什么?

1 个答案:

答案 0 :(得分:5)

你过早缩短了句子:

  

我们为所有光源使用单个阴影贴图,创建图像   使用多通道渲染并为每个灯执行一次通过   源。

因此阴影贴图一次包含单个光源的数据,但它们只使用一个贴图,因为它们一次只渲染一个光源。

我认为这会进入你的第二个问题 - 光是附加的,所以你只需将它们加在一起就可以合成多个灯光的结果。在GPU Gems的情况下,它们直接在帧缓冲区中加在一起,这无疑是因为当时GPU上可用的存储纹理采样器数量相对有限。现在你可能想要在帧缓冲区和直接在片段着色器中进行组合。

由于浮点舍入误差累积,你通常也应用“像素被点亮,如果它小于或等于阴影缓冲区中的距离加一点”而不是完全相等的测试。