我一直在阅读阴影映射,并找到了以下教程:
http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/
在作者开始讨论“暗疮”伪影之前,对我来说这一直很有意义。他们用下图(无字)解释原因:
我仍然很难理解实际上是什么导致暗疮痤疮以及为什么添加偏光可以修复暗疮。
似乎阴影贴图的分辨率对痤疮没有影响。之后怎么样了?也许 float 精度,还是其他?
最佳答案
是的,这是一个精度问题。并不是真正的 float 问题,只是有限的精度。
理论上,阴影贴图存储“距光到最近对象的距离”。但实际上,它存储“距离±距光的距离”。
然后在测试时,您的片段到同一盏灯的距离。但同样,实际上是±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)。或者一个人可以拿更多的样本。
要尝试回答这个问题:核心问题是阴影贴图比较理想距离。但是这些距离不是理想的,而是量化的。量化值通常很好,但是在这种情况下,我们将在两个不同的空间中对它们进行比较。
关于opengl - 什么引起暗疮痤疮?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36908835/