屏幕空间环境光遮蔽技术原理
一、SSAO 是什么(核心概念)
SSAO = Screen Space Ambient Occlusion,屏幕空间环境光遮蔽
作用:模拟角落、缝隙、物体相交处光线被遮挡变暗的真实阴影,解决 3D 画面“轻飘飘、塑料感、没有层次感”的问题。
底层原理通俗理解
现实中墙角、桌椅夹缝、模型穿插位置,环境漫反射光会被几何体挡住,会自然发黑;
普通渲染只计算直射光、全局光照,不会识别局部遮挡,缝隙依然亮,画面不真实。
SSAO 只靠当前屏幕像素做计算,不依赖场景几何数据:
- 读取深度纹理(画面每个像素离相机多远)
- 读取法线纹理(每个像素表面朝向)
- 以当前像素为中心,采样周边一圈邻域深度
- 判断邻域点是否在物体前方/后方:后方=被遮挡
- 遮挡越多,该像素乘一个变暗系数,实现局部暗化
关键:只在屏幕空间计算,速度远优于烘焙 AO、几何体 AO,属于后处理特效。
二、SSAO 和其他 AO 的区别
| 类型 | 原理 | 优缺点 | Unity适用场景 |
|---|---|---|---|
| SSAO(屏幕空间AO) | 后处理,基于深度图实时计算 | 实时、无烘焙、动态物体生效;远处精度低、边缘易失真 | 实时渲染、VR、动态角色、开放世界 |
| 烘焙环境光遮蔽(Baked AO) | 预计算存光照贴图 | 精度高、无性能消耗;动态物体无效,改模型要重烘 | 静态场景、室内建筑、静态道具 |
| HBAO / GTAO(SSAO进阶) | 优化采样与深度重建 | 画面更细腻、噪点更少,开销略高 | Unity URP/HDRP 高级管线 |
三、Unity 管线对应 SSAO 实现
Unity 三大渲染管线 SSAO 方案完全分开,不能混用:
1. 内置管线(Built-in RP)
- 旧版:
Image Effect后处理 SSAO(废弃,性能差) - 新版:Post Processing Stack v2(PPv2)
组件:Post Process Volume→ 添加效果Ambient Occlusion,模式选Screen Space
2. URP 通用渲染管线(最常用)
两种开启方式:
-
URP 内置 SSAO 后处理(PPv2)
Post Process Volume → Ambient Occlusion,模式:SSAO / HBAO -
URP 管线资产直接开启 AO(更快,集成渲染流程)
URP Asset → Quality → Screen Space Ambient Occlusion 勾选
推荐管线内开启,比独立后处理性能更好。
3. HDRP 高清渲染管线
默认集成GTAO(改良版SSAO,画质最优),在 HDRP 资源配置里开启,支持高精度、远距离遮蔽。
四、SSAO 核心参数详解(Unity PPv2)
以 URP PPv2 Ambient Occlusion 为例:
-
Intensity 强度
遮蔽变暗程度,0=关闭,0.5~1.2日常使用,数值越大缝隙越黑。 -
Radius 采样半径
邻域采样范围:- 小半径(0.1~0.3):精细缝隙、细节(枪械、道具)
- 大半径(0.5~1.5):大型物体、墙角、建筑轮廓
-
Bias 偏移阈值
解决模型曲面自身误遮挡(比如球体表面一圈黑边),数值抬升后过滤微小深度差。 -
Sample Count 采样数
采样点数量,直接控制噪点:- 低采样(8/16):快,画面颗粒噪点重
- 高采样(32/64):干净,GPU开销翻倍
-
Blur 模糊
降噪,采样低时必须开模糊;数值越高噪点越少,但遮蔽细节会丢失。 -
Fade Distance 远近淡出
远处逐渐关闭AO,降低远景性能消耗,防止远景糊成一团。
五、SSAO 优缺点
优点
- 全动态生效:角色、移动物体、破坏场景实时产生遮蔽,烘焙AO做不到
- 无需预计算,改模型不用重新烘焙光照
- 开销可控,移动端/主机都能跑低采样版本
- 极大提升画面厚重感,低成本提升写实度
缺点
-
屏幕空间局限:镜头外、被遮挡物体不会参与计算,会出现“AO断层”
例:墙体背后的物体不会对前方墙面产生遮蔽 - 远距离精度下降,远处AO容易糊、丢失细节
- 低采样有明显颗粒噪点,需要模糊降噪,模糊会轻微丢失细节
- 透明物体无法参与深度计算,透明件不会产生AO阴影
六、Unity 常见问题与优化
1. 模型出现一圈黑边、自身发黑
- 加大 Bias 偏移值
- 适当缩小 Radius
- 模型检查是否有重叠穿插面
2. 画面布满颗粒噪点
- 提高 Sample Count 采样数量
- 开启并加大 Blur 模糊强度
- 改用 HBAO 模式(比原生SSAO降噪更好)
3. 移动端卡顿
优化方案:
- 降低 Sample Count 至 8~16
- 增大 Blur,减少采样需求
- 缩小 Radius,减少采样范围
- 开启 Fade Distance,远景关闭AO
- 降低渲染分辨率缩放
4. VR 项目 SSAO 重影
- 降低半径与强度
- 调高Bias,减少曲面误遮蔽
- 使用管线内置AO而非独立后处理
七、简易实操步骤(URP 2022+)
- 创建 URP Asset 并给图形设置指定管线
- 打开 URP Asset → Quality → 勾选 Screen Space Ambient Occlusion
- 创建 Post Process Volume,勾选 Global(全局生效)
- 添加 Ambient Occlusion 效果,模式选 HBAO
- 调节 Intensity=0.8,Radius=0.4,Bias=0.02,Sample=32,Blur开中值
- 运行游戏,物体缝隙、墙角自动出现自然暗阴影
八、补充:HBAO / GTAO 和普通SSAO区别
- 原生SSAO:最早版本,采样粗糙,噪点多,性能最低
- HBAO(Horizon Based AO):地平线式采样,曲面更自然,噪点更少,URP主推
- GTAO(Ground Truth AO):HDRP专属,重建更精准深度信息,远距离AO不崩坏,画质天花板,开销最高
SSAO 在移动端性能压力大的完整原因
一、底层原理天生吃算力:大量采样+纹理读写
SSAO 核心逻辑是对每个屏幕像素,多次读取深度纹理、法线纹理做对比计算。
-
多重纹理采样开销极高
手机GPU(Mali/Adreno)带宽远低于电脑独显,深度纹理、法线纹理都是全屏高精度贴图。
假设 1080P 屏幕、单像素采样16次:
一帧就要读取1920×1080×16次深度图,海量显存读写。PC有大容量高速显存,手机带宽瓶颈极其明显。 -
分支判断多,移动端GPU不擅长
SSAO 内部大量if判断:判断邻域点是否被遮挡、远近淡出、裁剪、bias过滤。
移动端是基于瓦片的延迟渲染架构,分支多会打乱并行像素计算,GPU 利用率暴跌,出现大量空闲算力。
二、全屏后处理,分辨率直接放大消耗
SSAO 是全屏后处理特效,屏幕分辨率翻倍,算力近乎翻倍:
- PC 常见 1080/2K,可开渲染缩放降分辨率;
- 手机原生 1080P/1440P,很多游戏不敢大幅降分辨率,否则糊脸;
- 哪怕只开基础SSAO,也要单独渲染一张全屏 AO 贴图,再和原图混合,多一轮全屏Pass。
对比烘焙AO:烘焙AO预存在贴图里,渲染时只是一次纹理采样,几乎无实时开销;SSAO每帧重新算一遍全屏。
三、降噪必须的模糊步骤,二次全屏消耗
低采样SSAO会布满噪点,必须加高斯/双边模糊降噪:
- 模糊分为横向、纵向两次全屏Pass;
- 模糊半径越大,采样次数再翻倍;
手机GPU最怕连续多轮全屏渲染,每一轮都要读写帧缓存,带宽压力直接翻倍。
很多PC能扛住的32采样+中模糊,移动端直接掉帧。
四、移动端GPU硬件短板
1. 算力单元数量差距巨大
中端手机GPU算力 ≈ 十年前低端PC显卡,并行ALU数量极少。SSAO属于重数学计算(向量、点乘、距离、比较运算),刚好消耗ALU。
2. 瓦片渲染(TBDR)架构缺陷
手机主流 Mali、老Adreno 是瓦片延迟渲染:
渲染器会把画面切成小块逐个处理,SSAO需要访问全屏深度纹理,会破坏瓦片缓存,GPU要频繁刷新缓存,额外消耗带宽。
PC 是即时渲染(IBR),全局纹理读取效率高得多。
3. 浮点数精度开销
SSAO依赖高精度深度值(16/32位浮点数深度缓冲):
移动端高精度浮点运算速度比整数慢很多;为了避免曲面黑边,还要用高精度法线,进一步增加计算量。
五、Unity管线额外叠加开销
-
PPv2 独立后处理版本
单独开辟渲染纹理、额外拷贝画面,多一次全屏GPU拷贝,移动端带宽雪上加霜;
URP管线内置SSAO会优化,但依旧无法规避采样本身成本。 - 多相机、UI叠加场景
每个相机都要执行一遍SSAO后处理,分屏、小地图、渲染贴图场景开销成倍上涨。 - 动态物体叠加负担
移动端光照、阴影本身已经吃性能,再叠加SSAO多重采样,GPU负载直接触顶,极易发热降频。
六、视觉收益性价比低(移动端取舍逻辑)
- 手机屏幕尺寸小,缝隙、角落的AO细微变暗效果,玩家很难察觉;
- 一旦降低采样、模糊,噪点严重,画面变脏;拉高采样又掉帧;
- 很多手游直接舍弃实时SSAO,改用低成本替代方案:
- 烘焙静态AO贴图;
- 模型手绘暗边;
- 仅在主角色局部简单AO,不做全屏;
七、举个直观对比
PC:1080P,32采样+HBAO+中等模糊,占用GPU负载 5%~12%
中端手机:同参数,负载直接 30%~50%,再叠加实时光照、粒子、阴影,直接掉到30帧以下,手机发热降频后帧率更低。
补充:移动端减轻SSAO压力的常用手段
- 降低采样数(8/16采样,放弃32/64)
- 缩小Radius采样半径,减少邻域计算范围
- 开启远距离Fade,远景直接关闭AO
- 降低渲染分辨率缩放(Render Scale 0.7~0.85)
- 使用管线内置SSAO,不用PPv2独立后处理
- 降低模糊强度,改用快速简单模糊代替双边模糊
- 仅室内场景开启,户外直接关闭SSAO