MAKE · WRITE · SHARE

Unity-URP延迟渲染HBAO

HBAO(Horizon-Based Ambient Occlusion,基于地平线的环境遮蔽)从屏幕深度推测附近几何挡住了多少环境方向。它仍属于屏幕空间 AO,不是摆脱深度比较后的完整 GI。

原笔记记录了方向扫描、坡度与模糊。这里把它们放回遮蔽积分的近似模型,避免将“地平线角度越大”直接等同一个线性的灰度公式。文章保留原 URP 研究示意,具体实现须对应项目的深度与法线约定。

原 URP HBAO 研究画面

1. AO 近似什么

AO 可理解为表面半球中可见性经过余弦权重的平均。它描述几何遮蔽,不包含完整入射光分布和多次反弹;将其用于间接漫反射时,也应避免无条件压暗所有直接光和自发光。

屏幕深度只保存可见层,背面、屏外与被遮住的几何都不完整。因此屏幕空间方法有结构性局限,采样更多不能凭空恢复缺失信息。

2. 在方向切片中寻找地平线

从像素位置出发,沿若干屏幕方向采深度,并重建到一致的观察空间。每个方向形成一个切片,几何样本确定这个切片上能看见的最高遮挡方向。

多个扫描方向用于估计局部地平线

方向数量和每方向步数分别影响角向覆盖与径向精度。随机旋转或抖动可以打散规则条带,却会引入需要过滤或时域处理的噪声。

3. 坡度只是角度估计的一部分

可以由观察空间样本差向量估计地平线角,简单切片示意会写成 atan2(高度差,水平距离)。这里的高度和平面方向由切片基定义,不能把所有相机下的深度差都当成世界高度差。

原记录中的坡度几何示意

表面法线决定局部切平面与半球方向,积分还涉及地平线与切线角、距离衰减和偏差。把 0–90 度直接线性映射到 0–1,再做一次法线点积,并不是通用的 HBAO 正式推导。

4. 半径、偏差与厚度边界

半径决定关注多大邻域。若以世界/观察空间单位定义,投影到屏幕的采样跨度要随深度变化;固定像素半径表达的是另一种尺度。

偏差可以抑制平面自身误遮蔽,但过大会丢接触感。深度断层附近的采样需要限制,避免把前景轮廓当成很厚的遮挡体。

5. 双边滤波与降分辨率

普通模糊容易把 AO 拖过几何边界,因此常结合深度和法线进行边缘保持滤波。半分辨率降低样本数量,最后则需要引导上采样;宽高各半意味着输出像素为四分之一,而不是成本必然减半。

深度金字塔能支持某些尺度选择与跳过策略,但不是任何 HBAO 实现插一张 Hi-Z 就自动更快。选择最近、最远或范围深度,需要与保守性和实际算法匹配。

6. URP 接入检查

确认深度纹理来自哪个阶段、法线在哪个空间、动态分辨率与相机抖动是否匹配。自定义 RenderGraph Pass 要声明输入、临时 AO、滤波结果与合成目标的依赖。

验收平面、墙角、薄物体、屏幕边缘、相机运动与法线贴图。先看单独 AO,再看最终合成,避免把错误遮蔽隐藏在后处理里。

总结

HBAO 用方向地平线近似遮蔽。它的质量来自一致的空间重建、合理角度积分与边界处理;滤波和降采样控制成本,却不能修复屏幕信息本身缺失的问题。

参考资料