更好地了解阴影痤疮

Understaing shadow acne better

我目前正在学习 here 的阴影贴图。

我想弄清楚为什么会出现阴影痤疮,我试着查看了我在网上找到的每一个 video/resource,有些人认为这个问题与浮点舍入错误有关,有些人则说是关于阴影贴图的大小,如果它可以无限大,那么这个问题就不会发生,
但是我看到的解释 none 与为什么我看到这个 "trippy line pattern":

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

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

我还想知道,在希望了解这个问题的 原因 之后,biasing/face 剔除如何帮助解决这个问题,以及他们如何用这个问题换取 peter penning 问题,因为我认为没有明确解释为什么 发生这种情况而不是这种情况

阴影痤疮可能由不同的原因引起。

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

您从 [near, far] 范围内的 32 位线性化浮点值到存储在 [0, 1] 范围内的非线性深度(越接近 0 越精确) 24 位。换句话说,您在片段着色器中计算的某些深度值将映射到相同的 "texture color",这将导致深度测试失败。

例如给定的公式

near = 1far = 1000

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

如果由于精度误差,这 2 个值被映射到深度图中的 0.9995,则会出现这种情况。 当您计算深度测试时,其中一个将失败,因为 0.9995 < 0.9957.

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

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

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