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

Graphics 如何对多个点光源使用单个阴影贴图?,graphics,3d,rendering,shadow-mapping,Graphics,3d,Rendering,Shadow Mapping,据我所知,阴影贴图是通过从灯光的角度渲染场景来创建深度贴图来完成的。然后从摄影机的POV重新渲染场景,并为场景中的每个点(GLSL中的片段)计算从该点到光源的距离;如果它与你在阴影贴图中的匹配,那么它在光中,否则它在阴影中 我只是通读一遍,想了解如何使用点/全向光进行阴影贴图 第12.2.2节规定: 我们对所有光源使用单个阴影贴图 然后在12.3.6中,它说: 1) 计算从当前像素到光源的平方距离。 … 4) 将计算的距离值与获取的阴影贴图值进行比较,以确定我们是否处于阴影中 这大概就是我上面所

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

我只是通读一遍,想了解如何使用点/全向光进行阴影贴图

第12.2.2节规定:

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

然后在12.3.6中,它说:

1) 计算从当前像素到光源的平方距离。

4) 将计算的距离值与获取的阴影贴图值进行比较,以确定我们是否处于阴影中

这大概就是我上面所说的

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

我肯定我遗漏了什么,但希望有人能向我解释一下


另外,如果我们使用的是单个阴影贴图,那么如何将其混合到所有光源中


对于单个光源,阴影贴图仅存储距离光源最近的对象的距离(即深度贴图),但对于多个光源,它将包含什么?

您过早地缩短了句子:

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

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

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


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

我认为该句子的其余部分只是指他们通过渲染到相同的贴图(可能是相加的)来构建阴影贴图对于每个光源;并不是说他们清除并重新使用它。现在这更有意义了。。。这是一个遗憾——我真的希望我可以摆脱一个阴影贴图:如果你翻转东西并使用通常称为延迟渲染的东西,pYou可以。从摄影机渲染场景以输出深度+法线+每个像素的一些曲面信息,然后为每个灯光绘制一个全屏四元体,有效地在摄影机渲染中迭代。即使您的GPU只能输出8位RGBA(在移动世界中仍然很常见),您也可以在多个过程中对多个纹理执行第一位。太棒了。你刚刚给我开了一罐全新的虫子。我正在制作一个游戏,大多数对象都是静态的(或者很少改变),所以我想为所有静态对象预先计算阴影贴图,保留一个副本,并仅为移动对象更新它。我想支持尽可能多的灯光,所以我不认为从不同角度每秒60次重新渲染场景100次是可能的。但是阴影贴图会使用活动纹理,不是吗?我必须在最后一次渲染过程中一次绑定所有灯光,不是吗?最后一次渲染过程只需要那些尚未在帧缓冲区中累积的灯光。如果对象和灯光是完全静态的,并且有足够的存储空间,则可以准备仅由静态对象组成的局部灯光贴图,以便在每个帧中向其中添加其他对象。尽管听起来延迟可能更快,尤其是如果任何灯光在帧内都有距离截止(在这种情况下,它们不必应用于每个像素)。