环境光遮蔽 Ambient Occlusion

省流版本
-
左边 (Simple shading / 简单的光照): 看老爷爷的脸,是不是感觉皱纹、鼻孔、耳朵眼这些地方有点“亮得不自然”,显得整个脸很平? 这是因为在早期的简单光照模型(比如 Blinn-Phong)里,环境光 (Ambient) 通常被粗暴地设定为一个全局的常数值。引擎才不管你这块肉是平坦的额头,还是深深凹陷的眼窝,它都给你加上同样强度的底光。这就导致那些原本应该暗藏阴影的缝隙,看起来缺乏深度。
-
中间 (Ambient occlusion texture map / AO 贴图): 为了解决上面的问题,但又不想在游戏运行时进行极其耗费性能的复杂光线追踪,聪明的前辈们发明了 “预计算 (Precomputed)” 这招。 在 3D 软件(比如 Maya 或 Substance Painter)里,引擎会提前发射无数条射线,去探测模型表面的每一个点。如果一个点在深深的沟壑里(比如耳洞),射线很容易被周围的肉挡住,这个点就会被画成黑色;如果在平坦的额头上,射线四通八达,就会被画成白色。最后,把这些黑白信息存成一张 2D 贴图,也就是图中中间这张像人皮面具一样的图!
-
右边 (With ambient occlusion / 加上 AO 后的效果): 在游戏引擎里,我们只需要把左边的基础光照颜色,乘以中间这张 AO 贴图。 黑色的地方(值为 0)相乘后变暗,白色的地方(值为 1)保持原样。噔噔!老爷爷的脸瞬间立体了!那些光线难以到达的犄角旮旯都被压暗了,皱纹显得极其深邃,岁月沧桑感直接拉满!
拓展
AO 到底在“遮蔽”什么?
在真实世界里,光线是会在物体之间来回反弹的(全局光照 Global Illumination)。哪怕是在阴影里,物体也能接收到周围环境漫反射过来的微弱光线(环境光 Ambient Light)。
- 没有 AO 的世界: 在早期的渲染引擎里,为了节省算力,环境光被极其粗暴地设定为一个全局统一的常数值。这就导致一个问题:不管你是平坦的额头,还是深深凹陷的鼻孔,引擎都给你加上完全一样强度的环境光。结果就是物体看起来像塑料,毫无体积感,仿佛“漂浮”在场景里。
- AO 的诞生: 图形学前辈们想出了一个极其聪明的“骗术”。他们观察到:缝隙越深、角落越刁钻的地方,光线越难钻进去。所以,AO 的本质并不是在计算光,而是在计算 “几何体的可见度”!它通过压暗那些“不容易被光照到”的犄角旮旯,伪造出了极其逼真的立体感。
AO 的数学本质
既然要学底层的渲染逻辑,就不能只停留在“把缝隙涂黑”这种美术概念上。在图形学里,点 处的环境光遮蔽值 是通过半球积分来定义的:
- 是当前渲染的表面点。
- 是以 为中心的半球方向。
- 是可见性函数 (Visibility Function)。如果沿着 方向发射一条射线,碰到了别的物体,结果就是 (被遮挡);没碰到就是 (未遮挡)。
- 是用来计算角度衰减的(兰伯特余弦定理)。
简单来说:从一个点向四面八方发射无数根射线,看看有多少根被周围的肉给挡住了。挡住的越多,这个点就越黑!
AO 的进化史
我们以后在引擎里会遇到各种各样带“AO”后缀的名词,千万别被唬住了。它们其实就是为了实现上面那个积分公式,在不同硬件时代的“妥协产物”:
1. 预计算 AO (Baked AO / Precomputed AO)
- 原理: 就是前面给你看的老爷爷人皮面具图。在 3D 建模软件(如 Substance Painter)里,提前花几个小时把射线积分算好,存成一张黑白的 2D 贴图。
- 缺点: 它是死板的。如果老爷爷张开嘴巴,嘴唇之间的折痕本来应该展开变亮的,但因为贴图是画死的,所以依然是黑的。
2. 屏幕空间 AO (Screen Space Ambient Occlusion, SSAO)
- 原理: 时代变了!德国的 Crytek(孤岛危机开发商)发明了这种黑魔法。它不再依赖预先烘焙,而是只利用摄像机当前看到的深度图 (Depth Buffer),在屏幕空间 2D 像素层面上,推测哪些地方是凹陷的,并在实时渲染时动态加上阴影!
- 缺点: 瞎子摸象。如果一个物体在屏幕外(摄像机没拍到),它就不会对屏幕内的物体产生遮蔽阴影。而且在物体边缘容易产生奇怪的光晕 (Halo)。
3. 现代进阶版 (HBAO, GTAO)
- 原理: 都是 SSAO 的数学强化版。比如 HBAO (Horizon-Based AO) 基于地平线角度来计算,GTAO (Ground Truth-Based AO) 则通过更严谨的积分几何推导,让屏幕空间的 AO 效果几乎能媲美离线光线追踪的真实度。
4. 光线追踪 AO (Ray Traced AO, RTAO)
- 原理: 算力自由的终极答案!直接在显卡里实时利用硬件加速,从每个像素发射真实的射线去碰撞场景几何体,完美还原那个半球积分公式。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时






