02 - PCSS

本文将介绍如何利用PCSS生成软阴影,并介绍PCF,将其与PCSS的概念区分开。

软硬阴影

当光源足够大时会产生软阴影:

PCF(Percentage Closer FIltering)

用途

最初用于解决影子的抗锯齿问题,但在这里(PCSS生成软阴影)的作用是 过滤阴影比较的结果

为什么不直接过滤SM?直接过滤SM就是取颜色部分的均值,会导致SM变糊;对深度值取平均后比较,会得到0/1的可见性,中间没有过渡。

做法

对地板上的每个着色点,取它和周围着色点是否被遮挡结果的均值,从而决定该点是否为阴影的程度。

其中,取点的范围越大,阴影越软/柔和;取点范围越小,阴影越硬/锐利。因此PCF过滤的取点范围偏大时,会造成“软阴影”效果。

如何决定合适的取点范围

可以从真实世界取材:

如图,发现阴影部分离遮挡物越近,阴影就越硬。那么 物体离阴影的距离(相对平均的投影遮挡距离)和PCF取点过滤的大小有关。如下图,它们间有相似三角形关系:

其中,该怎么求呢,在PCSS部分会揭晓。

背后的数学

为什么PCF不是对SM纹理本身作比较,而是比较 是否可见的结果?数学可以告诉我们答案。

滤波/卷积公式: 就是对于任意一点p,取周围一圈作为邻域,进行卷积操作,结果写入p中。

PCF可以写成这样的形式: 根据SM和摄像机视角两深度值差的正负,可以决定该点的可见性是0还是1,最后将这些点可见性结果进行卷积操作。

再看看直接对SM本身作比较的式子:

因此结论就是最开头说的那句话,PCF不是对SM纹理本身作比较,而是比较 是否可见的结果

PCSS(Percentage Closer Soft Shadow)

有了PCF作为铺垫,我们就能正式开始PCSS的内容了。

算法步骤

  1. 寻找遮挡物(Blocker Search):在深度贴图中,开辟一块特定区域,取遮挡物深度的均值不是所有深度的均值)。

    有关“特定区域”:可以是常量(5x5);也能根据光源大小和光源离着色点的距离动态计算。

  2. 相似三角形估算(Penumbra estimation):有了后,就能根据上面的相似三角形关系求出PCF过滤的大小。

  3. 进行PCF

有关PCSS的简单实现详见作业一相关文章。

缺点

  • 开销很大:在第一步和第三步中,需要遍历SM的每个纹素,很难达到RTR效果;如果要做到更软的阴影,PCF过滤区域就要求更大,然后运行得更慢。

优化

  1. 对第一和第三步的SM做稀疏采样,只看其中的若干纹素。这样子的结果肯定有噪声,只需在时间/空间层面上降噪一次即可。 由于现在降噪技术突飞猛进,人们更偏向于使用这个方法
  2. 使用VSSM(Variance Soft Shadow Mapping)。

参考资料

  • GAMES202: 高质量实时渲染 (ucsb.edu)