SSAO的进化版。
不再是通过对比深度来判断是否遮挡,而是寻找每个方向上的地平线高度。
原理
基础
GI是一个几何点从旁边所有角度的光照和。
HBAO就是从几何点往旁边和方向去计算遮蔽的过程,通过简化方向为8个或者16个,结果贴合GI的原理。
从一个几何点,往周围若干个方向打射线,找到每个方向的最大遮挡高度的角度。
下图中,S0、S1、S2、S3是4个方向的射线,分别会得到一个最大的水平角。
方向越容易被遮挡——>水平角越大——>AO越强

如何计算水平角?
1.计算坡度Slope
坡度 = 高度变化 / 水平变化
tanAngle = 红色 / 蓝色
红色 = 当前射线深度Z - 原始深度Z
蓝色 = 两个平面空间点的距离。length(当前射线点.xy - 原始点.xy)

所以角度就是arctan(红色蓝色)
如何计算AO贡献?
水平角越大,AO越大。
0到90度的范围,AO遮蔽贡献转换到0到1。
在考虑一下背面的三角形,和法线做一下Dot,调整一下AO值。
最后合计的时候平均一下,
这个几何点的AO = 所有方向的AO加起来 / 方向数量。
优化项
双边滤波模糊
考虑深度的模糊,避免因为像素算法影响到旁边正常的几何。
降分辨率计算
一个点需要几十上百次采样,非常耗费性能。
通常只渲染半分辨率的HBAO。
HIZ优化步数采样
HIZ