1

我目前正在从这里学习阴影映射。

我试图弄清楚为什么会发生阴影痤疮,我尝试查看我在网上找到的每个视频/资源,有些人将问题与浮点舍入错误联系起来,其他人说它与阴影贴图的大小和如果它可以无限大,那么这个问题就不会发生,
但我所看到的解释都没有与我看到这个“迷幻线模式”的原因有关: 在此处输入图像描述

一些解释甚至包括某种抽象绘图,可以在视觉上与屏幕上的现象相关,但实际上并不能很好地解释发生这种情况的根本原因: 在此处输入图像描述

为了足够的解释,我一直在为这个到处寻找一整天而摸不着头脑。
我基本上是在寻找对这种现象的新解释,希望是一个清晰友好的解释。

我也想知道在希望了解其原因之后,偏见/面部剔除如何帮助解决这个问题,以及他们如何将这个问题换成彼得潘宁问题,因为我认为没有明确的解释为什么会发生这种情况而不是这个.

4

1 回答 1

3

暗影痤疮可能来自不同的原因。

第一个是阴影贴图的精度和在着色器中计算的实际深度的问题。您存储在深度图中的深度从 映射[near, far][0, 1]

您从该范围内的 32 位线性化浮点值变为可能存储在 24 位中的[near, far]范围内的非线性化深度(距离 0 越近,精度越高) 。[0, 1]换句话说,您在片段着色器中计算的某些深度值将被映射到相同的“纹理颜色”,这将导致深度测试失败。

例如使用给定的公式

在此处输入图像描述

near = 1和_far = 1000

F(700) = 0.99957, F(701) = 0.99948 ~= 0.9995 

如果由于精度误差,这 2 个值在深度图中映射到 0.9995。当您计算深度测试时,其中之一将失败,导致 0.9995 < 0.9957。

另一个问题可能来自 shadowMap 对于您的实际相机视角而言太小(透视锯齿)。

在此处输入图像描述

正如您在这张图片中看到的那样,树的一侧在相机视角中比在 sadowMap 中占据更多位置。屏幕中覆盖树侧面的像素比 shadowMap 中的多,因此您在相机视点中计算的某些像素将在 lightPoint of view 中使用相同的深度信息,某些测试可能指向相同的阴影地图像素和会fai。d > ds

在这两种情况下添加偏差,将消除浮点误差,或者在 2 深度测试点到相同的 shadowMap 像素时补偿误差。添加偏差可以看作是误差范围。有了偏见,您接受了一些以前被拒绝的测试

于 2019-11-08T06:54:14.760 回答