我一直在阅读阴影贴图,并找到了以下教程:
http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/
直到作者开始讨论"阴影痤疮"神器。他们用下图解释原因(没有文字):
我仍然很难理解究竟是什么原因导致阴影痤疮以及为什么要添加偏见来修复它。
阴影贴图的分辨率似乎对痤疮没有影响。之后怎么样了?也许浮动精度,还是别的?
答案 0 :(得分:7)
是的,这是一个精确的问题。不是浮动问题,只是有限精度。
理论上,阴影贴图存储“距离光线最近的物体的距离”。但实际上它存储了“距离光的距离±eps”。
然后在测试时,你的碎片距离相同的光线。但同样,在实践中±eps2。因此,如果比较这两个值,结果表明,在插入阴影贴图渲染或着色时,eps会有不同的变化。因此,如果您比较d ± eps < d2 ± eps2
,如果d2==d
,则可能会得到错误的结果,因为eps!=eps2
。但如果你比较d ± eps < d2 + max(eps) + max(eps2) ± eps2
你会没事的。
在此示例d2==d
中。这被称为自我阴影。并且可以通过上述偏差轻松修复,或者在光线追踪中不测试自己。
使用不同的对象以及eps和eps2差别很大时会变得更加棘手。处理它的一种方法是控制eps(http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf)。或者可以采取更多样本。
试图回答这个问题:核心问题是阴影贴图比较理想距离。但这些距离并不理想,而是量化的。量化值通常很好,但在这种情况下,我们将它们在两个不同的空间进行比较。