GPU Gems1 - 11 阴影贴图反走样

本文深入探讨了阴影贴图技术及其反走样方法——邻近百分比过滤(PCF)。详细讲解了阴影深度图算法的2pass流程,以及PCF如何通过改进传统阴影贴图的深度测试顺序,实现软阴影效果,解决阴影边界锯齿问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这章介绍了如何通过邻近百分比过滤方法(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)

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值