URP 渲染实战 / 第 8 章 环境光、光照贴图与反射探针 / 案例 8.10
案例 8.10材质 AO 与 SSAO进阶
目标:同一个场景(砖墙 + 白色方块 + 白色球),对比无 AO、只有材质 AO、材质 AO + SSAO 三种情况。为了让环境光成为主角,主光强度调得较低。GILit 中 AO 相关的代码就是片元第 ③ 步的两行,没有更多内容。SSAO 在 URP 14 中是 internal 类,拍摄脚本用反射添加,并把半径从默认的 0.035 米调到 0.25 米以匹配本场景的尺度;在你的项目里,直接在 Universal Renderer Data 的 Inspector 中 即可。

右图同时暴露了 SSAO 的典型问题:方块边缘有颗粒状的噪点,这是采样数有限、模糊不足造成的;如果相机移动,屏幕边缘还会出现遮挡“突然消失”的现象。SSAO 的参数(半径、强度、采样数、模糊质量、降采样)需要按场景尺度和目标平台调整,第 28 章会讲它的原理并实现一个简化版。移动端上 SSAO 开销较高(一次 DepthNormals Pass + 若干全屏 Pass),中低端设备通常关闭,改用烘焙 AO 或光照贴图里的遮蔽。
注意自写 Shader 想要被 SSAO 正确处理,必须提供 DepthNormals Pass(SSAO 的 Depth Source 默认是 Depth Normals)。没有这个 Pass 的物体在 SSAO 里是“隐形”的:它不会遮挡别人,自己身上的 AO 也会根据背后物体的深度胡乱计算。GILit 的 DepthNormals Pass 写在
Ch08Passes.hlsl 中;由于 GILit 的主 Pass 是 UniversalForwardOnly,Deferred 路径下 URP 会改用 DepthNormalsOnly 这个 LightMode 取法线,所以 GILit 同时提供了这两个 Pass(与 URP Unlit 的做法相同)。本案例出自《URP 渲染实战》第 8 章「环境光、光照贴图与反射探针」。在章节中阅读上下文 →