02 - PCSS
本文将介绍如何利用PCSS生成软阴影,并介绍PCF,将其与PCSS的概念区分开。
软硬阴影
当光源足够大时会产生软阴影:
PCF(Percentage Closer FIltering)
用途
最初用于解决影子的抗锯齿问题,但在这里(PCSS生成软阴影)的作用是 过滤阴影比较的结果。
为什么不直接过滤SM?直接过滤SM就是取颜色部分的均值,会导致SM变糊;对深度值取平均后比较,会得到0/1的可见性,中间没有过渡。
做法
对地板上的每个着色点,取它和周围着色点是否被遮挡结果的均值,从而决定该点是否为阴影的程度。
其中,取点的范围越大,阴影越软/柔和;取点范围越小,阴影越硬/锐利。因此PCF过滤的取点范围偏大时,会造成“软阴影”效果。
如何决定合适的取点范围
可以从真实世界取材:
如图,发现阴影部分离遮挡物越近,阴影就越硬。那么 物体离阴影的距离(相对平均的投影遮挡距离)和PCF取点过滤的大小有关。如下图,它们间有相似三角形关系:
其中,
背后的数学
为什么PCF不是对SM纹理本身作比较,而是比较 是否可见的结果?数学可以告诉我们答案。
滤波/卷积公式:
就是对于任意一点p,取周围一圈作为邻域 ,进行卷积操作,结果写入p中。
PCF可以写成这样的形式:
再看看直接对SM本身作比较的式子:
因此结论就是最开头说的那句话,PCF不是对SM纹理本身作比较,而是比较 是否可见的结果。
PCSS(Percentage Closer Soft Shadow)
有了PCF作为铺垫,我们就能正式开始PCSS的内容了。
算法步骤
寻找遮挡物(Blocker Search):在深度贴图中,开辟一块特定区域,取遮挡物深度的均值
(不是所有深度的均值)。有关“特定区域”:可以是常量(5x5);也能根据光源大小和光源离着色点的距离动态计算。
相似三角形估算(Penumbra estimation):有了
后,就能根据上面的相似三角形关系求出PCF过滤的大小。进行PCF。
有关PCSS的简单实现详见作业一相关文章。
缺点
- 开销很大:在第一步和第三步中,需要遍历SM的每个纹素,很难达到RTR效果;如果要做到更软的阴影,PCF过滤区域就要求更大,然后运行得更慢。
优化
- 对第一和第三步的SM做稀疏采样,只看其中的若干纹素。这样子的结果肯定有噪声,只需在时间/空间层面上降噪一次即可。 由于现在降噪技术突飞猛进,人们更偏向于使用这个方法。
- 使用VSSM(Variance Soft Shadow Mapping)。
参考资料
- GAMES202: 高质量实时渲染 (ucsb.edu)