7

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

我只是在阅读本教程以了解如何使用点/全向光进行阴影映射。

根据第 12.2.2 节,它说:

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

然后在 12.3.6 下它说:

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

这大致就是我上面所说的。

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

我确定我遗漏了一些东西,但希望有人可以向我解释这一点。


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

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

4

1 回答 1

5

你过早地缩短了句子:

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

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

我认为这涉及到你的第二个问题——光是相加的,所以你只需将多个光的结果加在一起就可以组合起来。在 GPU Gems 的案例中,它们直接在帧缓冲区中相加,这无疑是因为当时 GPU 上可用的存储纹理采样器数量相对有限。现在,您可能希望在帧缓冲区和直接在片段着色器中进行组合。

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

于 2012-03-12T02:55:32.647 回答