SSAO 屏幕空间环境光遮蔽:原理与实现
什么是 SSAO
SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽)是一种后处理效果,用于近似模拟环境光遮蔽(Ambient Occlusion,AO)。在现实世界中,角落、缝隙等区域由于被周围几何体遮挡,接收到的环境光较少,因此更暗。SSAO 通过分析屏幕空间中的深度和法线信息,估算每个像素的遮蔽程度,输出灰度遮罩,将其应用于环境光照,增强场景的深度感和真实感。
SSAO 的原理
SSAO 的核心思想是:对于屏幕上的每个像素,在其法线方向的半球内采样周围的深度缓冲,比较采样点的深度与对应像素的深度,判断采样点是否位于表面前方(即被遮挡)。如果许多采样点被遮挡,则该像素的遮蔽因子较低,颜色变暗。
具体步骤:
- 获取屏幕空间中的深度和法线信息(通常来自 G-Buffer)。
- 对于每个像素,在其半球内生成随机采样点(叠加随机旋转噪声)。
- 将采样点投影到屏幕空间,采样深度缓冲。
- 比较采样深度与表面深度,若采样点深度大于表面深度,则该方向被遮挡。
- 综合所有采样点的结果,计算遮蔽因子。
- 输出遮蔽纹理,用于调制环境光照。
- **降采样**:在较低分辨率下计算 SSAO,再上采样模糊。
- **减少采样数**:通常使用 8-16 个采样点,配合随机旋转和模糊。
- **使用半球法线**:限制采样在表面法线半球内,减少无效采样。
- **深度范围限制**:仅考虑一定距离内的遮挡,避免远距离不相关遮挡。
- 实时性能好,无需预计算。
- 适用于动态场景和任意几何体。
- 增强视觉真实感,尤其在小尺度细节。
- 屏幕空间限制:只能利用可见像素的信息,无法处理屏幕外的遮挡。
- 可能产生闪烁和噪声,需要模糊处理。
- 可能产生深度不连续处的伪影(如前景物体错误遮挡背景)。
- **烘焙 AO**:离线预计算,将 AO 信息烘焙到纹理或顶点色,适合静态场景,无运行时开销。
- **光线追踪 AO**:使用硬件光线追踪精确计算,但性能昂贵,需现代 GPU。
- **SSAO**:实时近似,性能适中,是最常用的动态 AO 技术。
SSAO 的实现与优化
SSAO 有多种变体,如 Crytek 的原始 SSAO、HBAO(Horizon-Based Ambient Occlusion)、GTAO(Ground Truth Ambient Occlusion)等。在 Unity 和 Unreal 中,后处理栈提供了 SSAO 选项。
优化技巧:
SSAO 的优缺点
**优点**:
**缺点**:
与其他 AO 技术的比较
常见问题
SSAO 和 AO 有什么区别?
AO(环境光遮蔽)是一类技术的总称,SSAO 是其中一种基于屏幕空间的实时近似方法。其他 AO 方法包括烘焙 AO、光线追踪 AO 等。
SSAO 对性能影响大吗?
SSAO 需要多次深度采样和后期处理,对性能有一定影响,但通过降采样和优化可以控制。
移动端可以使用 SSAO 吗?
移动端 GPU 性能有限,SSAO 可能过于昂贵,可以使用简化版本或预烘焙 AO。
如何减少 SSAO 噪声?
使用随机旋转噪声、增加采样数、应用模糊过滤(如双边滤波)可以降低噪声。
SSAO 需要法线信息吗?
需要,法线用于确定采样半球方向,通常从 G-Buffer 获取。若无显式法线,可以从深度重建。
常见问题
SSAO 和 AO 有什么区别?
AO 是环境光遮蔽技术的总称,SSAO 是其中一种基于屏幕空间的实时近似方法。
SSAO 对性能影响大吗?
SSAO 需要多次深度采样和后期处理,对性能有一定影响,但通过优化可以控制。
移动端可以使用 SSAO 吗?
移动端性能有限,SSAO 可能过于昂贵,可使用简化版本或预烘焙 AO。
如何减少 SSAO 噪声?
使用随机旋转噪声、增加采样数、应用模糊过滤(如双边滤波)可降低噪声。
SSAO 需要法线信息吗?
需要,法线用于确定采样半球方向,通常从 G-Buffer 获取,也可从深度重建。