这章介绍了如何通过邻近百分比过滤方法(Percentage-Closer Filtering , PCF)有效减少阴影贴图的反走样,并描述了如何实现一个简化版本,并对PCF方法进行了一定改进。关于阴影贴图和PCF技术的一些链接
https://pubweb.eng.utah.edu/~cs5610/handouts/reeves87.pdf
https://gameinstitute.qq.com/community/detail/101354
首先介绍一下阴影贴图技术。
阴影深度图算法是一个2 pass算法。第一遍生成一张光照空间的深度图。在第二遍,这张图被用来比较每个像素在光照空间中的深度和在光照深度图中的深度。
Pass1
在第一阶段,将场景从光源的方向渲染到一个深度缓冲区。更具体地说,顶点着色器将几何体变换到光照视图空间。第一阶段的最终结果是一个光照方向的场景深度缓存信息(阴影贴图)。其可用于Pass 2,以确定从光源开始,哪些像素是被遮挡的
Pass2
在第二阶段,顶点着色器对每个顶点变换2次。每个顶点变换到像机视空间(camera view)并作为位置(position)传入像素着色器。每个顶点还由光源的视点-投影-纹理(view-projection-texture)矩阵变换并且作为纹理坐标(texture coordinate)传入的像素着色器。view-projection-texture矩阵和Pass1中用来渲染场景的矩阵(view-projection)是相同的只是多了一个额外的变换(到texture空间的变化)。这个变换将点从视图空间(XY在-1到1)变换到纹理空间(X为0到1,Y为1到 0)。
像素着色器获得了插值后的位置(position)和纹理坐标(texture coordinate)。现在在纹理坐标中的一切都需要进行深度测试。通过纹理坐标的X和Y在pass1中的深度缓冲中进行索引,然后与位置坐标(position)的Z值比较来进行深度测试从而渲染阴影。
PCF软阴影技术
传统的阴影贴图技术是先对阴影贴图中的采样点filter取平均值,然后再与该位置的z值相比较,返回0或1.例如下图的例子:待渲染的像素点z值为49.8,阴影贴图中的九个采样点平均值为22.9,小于49.8,也就是说有比该渲染的像素离光源更近的像素,因此该像素点在阴影中,返回1.
PCF技术则是将filter和compare两个操作的顺序反转,先compare进行深度测试得出0或1,再根据得到的结果进行filter。如下图所示,先与待渲染像素的z值即49.8进行compare后得到各插值点的0或1值,再取平均值,即5/9 = 0.55。这解决了传统的阴影贴图技术只能返回0或1,阴影边界走样的问题,从而实现了软阴影。
GEM这篇文章中,实现了简化版的PCF,只是简单的在各处使用一个4X4 texel(纹素)的样本块、这个块应该大到能够有效地减少走样,但是不能达到要求大量样本和随机取样的程度。如下图。
可以看到3幅图中的显示效果区别很明显,图(c)中每像素取16个样本,效果最为出色,达到了反走样的预期。
【关键词提炼】
反走样/抗锯齿(Antialiasing)
邻近百分比过滤(Percentage-Closer Filtering , PCF)
透视阴影贴图( perspective shadow maps)