GAMES202(1)阴影映射

本节主要介绍关于阴影映射的诸多问题,同时介绍了几个用于优化阴影效果的算法。

走样(锯齿)问题

图源image-20211109102240265

我们将这种锯齿现象归因于两方面:透视以及投影

可以说,人们大多数时候解决阴影的锯齿问题时,都是在尝试解决由透视产生的锯齿。

自遮挡以及阴影脱离现象

更多是因为我们采用的阴影贴图精度不够,导致一个像素可以覆盖很多个点,导致原本都是可见的点之间产生了互相遮挡。

可以通过增加一个shadow bias来消除这种遮挡。

但是shadow bias又会导致一些时候产生阴影脱离现象(既一部分应该在阴影中的区域产生了受光)。

软阴影算法

PCF

对当前位置在阴影贴图所处的像素周围的一定范围内像素进行比较,返回一个[0,1]范围内的值,而不是一个二值的判断。

PCSS

离遮挡物越近,阴影的过渡带越短。

因此我们可以通过阴影离遮挡物的距离,使用不同的滤波范围。

方差阴影贴图

PCF的问题

是对当前像素周围的像素判断大小,其实很类似于对纹理采样时纹理放大导致我们需要对范围求平均的方法。是否可以利用和MipMap类似的思路?

PCF需要解决的问题是范围内大于一个值t的比例,采用切比雪夫不等式。我们只要得到当前像素周围像素分布的均值和方差,就可以较快得出范围内大于值t比例的上界,我们将其近似认为为最终的结果。

均值较好得出,可以利用类似MipMap的思路。

方差的话,可以通过求深度值平方的均值,再和均值MipMap相减得出。

VSM的问题:

切比雪夫不等式的估计过于粗糙,会产生漏光现象。

考虑方差和分布都分别只是随机变量期望的二阶矩和一阶矩,因此我们可以考虑采用更高阶的矩(moment)进行近似。这就是MSM(Moment Shadow Mapping)。

SDF

SDF可以应用于:

RayMarching, 字体渲染,以及SDF阴影。

SDF阴影

相当于从一个着色点出发,向光源做Marching,直到到达前都记录最小的SDF值。

image-20211110202906137

不使用反三角函数,而是使用一个线性函数,同时做saturate,可以通过参数k调整阴影的锐利感。

image-20211110203239944

SDF阴影的优缺点

优点

缺点