是什么导致阴影痤疮?

nic*_*yte 7 opengl graphics rendering shadow-mapping

我一直在阅读阴影贴​​图,并找到了以下教程:

http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

直到作者开始讨论"阴影痤疮"神器时,我才有意义.他们用下图解释原因(没有文字): 在此输入图像描述

我仍然很难理解究竟是什么原因导致阴影痤疮以及为什么添加偏见会修复它.

似乎阴影贴图的分辨率对痤疮没有影响.之后怎么样了?也许漂浮精度,还是别的?

sta*_*ole 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).或者可以采取更多的样品.

试图回答这个问题:核心问题是阴影映射比较理想距离.但这些距离并不理想,而是量化的.量化值通常很好,但在这种情况下,我们将它们在两个不同的空间中进行比较.