是什么导致阴影痤疮?
What causes shadow acne?
我一直在阅读阴影贴图,发现了以下教程:
http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/
在作者开始讨论 "shadow acne" 神器之前,这对我来说是有意义的。他们用下图解释了原因(没有文字):
我仍然很难理解究竟是什么导致了阴影痤疮,以及为什么添加偏差可以解决它。
阴影贴图的分辨率好像对痘痘没有影响。之后怎么样了?可能是浮点精度,还是别的?
是的,这是一个精度问题。不是真正的浮动问题,只是有限精度。
理论上阴影贴图存储"distance to closest object from light"。但实际上它存储 "distance±eps from light"。
然后在测试时,你的碎片距离相同的光。但同样,在实践中±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)。或者一个人可以采取更多的样本。
尝试回答问题:核心问题是shadow mapping比较的是理想距离。但是这些距离不是理想的而是量化的。量化值通常很好,但在这种情况下,我们是在两个不同的空间中比较它们。
我一直在阅读阴影贴图,发现了以下教程:
http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/
在作者开始讨论 "shadow acne" 神器之前,这对我来说是有意义的。他们用下图解释了原因(没有文字):
我仍然很难理解究竟是什么导致了阴影痤疮,以及为什么添加偏差可以解决它。
阴影贴图的分辨率好像对痘痘没有影响。之后怎么样了?可能是浮点精度,还是别的?
是的,这是一个精度问题。不是真正的浮动问题,只是有限精度。
理论上阴影贴图存储"distance to closest object from light"。但实际上它存储 "distance±eps from light"。
然后在测试时,你的碎片距离相同的光。但同样,在实践中±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)。或者一个人可以采取更多的样本。
尝试回答问题:核心问题是shadow mapping比较的是理想距离。但是这些距离不是理想的而是量化的。量化值通常很好,但在这种情况下,我们是在两个不同的空间中比较它们。