GAMES202(1)阴影映射
本节主要介绍关于阴影映射的诸多问题,同时介绍了几个用于优化阴影效果的算法。
走样(锯齿)问题
我们将这种锯齿现象归因于两方面:透视以及投影。
- 透视:由透视的缩短现象导致的阴影锯齿。
- 投影:由光源位置、相机位置以及几何信息导致的。
可以说,人们大多数时候解决阴影的锯齿问题时,都是在尝试解决由透视产生的锯齿。
-
透视阴影贴图(PSM),在透视变换后的空间生成阴影贴图,大大减少透视造成的锯齿
- 自适应阴影贴图(ASM)
- 级联阴影贴图(CSM)。大场景动态阴影的解决方案。核心思想:距离摄像机越远,绘制没有锯齿的阴影所需要的阴影贴图分辨率就越小。因此我们将摄像机划分为多个视锥,对这些视锥分别计算深度贴图,但是我们可以看出视锥之间是会有精度不连续的,我们需要在视锥之间做一定的精度插值。
自遮挡以及阴影脱离现象
更多是因为我们采用的阴影贴图精度不够,导致一个像素可以覆盖很多个点,导致原本都是可见的点之间产生了互相遮挡。
可以通过增加一个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值。
不使用反三角函数,而是使用一个线性函数,同时做saturate,可以通过参数k调整阴影的锐利感。
SDF阴影的优缺点
优点
-
快
-
高质量
缺点
- 需要预计算
- 需要很高的内存
- 可能会有artifact