mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
1564 字
4 分钟
环境光遮蔽 Ambient Occlusion
2026-05-05

环境光遮蔽 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 的数学本质#

既然要学底层的渲染逻辑,就不能只停留在“把缝隙涂黑”这种美术概念上。在图形学里,点 pp 处的环境光遮蔽值 A(p)A(p) 是通过半球积分来定义的:

A(p)=1πΩV(p,ω)(nω)dωA(\mathbf{p}) = \frac{1}{\pi} \int_{\Omega} V(\mathbf{p}, \mathbf{\omega}) (\mathbf{n} \cdot \mathbf{\omega}) d\omega

  • p\mathbf{p}是当前渲染的表面点。
  • Ω\Omega 是以 p\mathbf{p} 为中心的半球方向。
  • V(p,ω)V(\mathbf{p}, \mathbf{\omega})可见性函数 (Visibility Function)。如果沿着 ω\omega 方向发射一条射线,碰到了别的物体,结果就是 11(被遮挡);没碰到就是 00(未遮挡)。
  • (nω)(\mathbf{n} \cdot \mathbf{\omega}) 是用来计算角度衰减的(兰伯特余弦定理)。

简单来说:从一个点向四面八方发射无数根射线,看看有多少根被周围的肉给挡住了。挡住的越多,这个点就越黑!


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)

  • 原理: 算力自由的终极答案!直接在显卡里实时利用硬件加速,从每个像素发射真实的射线去碰撞场景几何体,完美还原那个半球积分公式。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

环境光遮蔽 Ambient Occlusion
https://misuzu0010.github.io/posts/ao/
作者
Misuzu0010
发布于
2026-05-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录