全部模型资源
  • 全部模型资源
  • - 交通工具
  • - 动物昆虫
  • - 场景\道具模型
  • - 建筑模型
  • - 植物模型
  • - 武器模型
  • - 独家资源库
  • - 科幻模型
  • - 角色动画库
  • - 角色模型
  • 游戏开发知识博客

环境光遮蔽全解:算法原理、各类 AO 对比及其在 VR 中的应用

每年,开发者都在努力把游戏的各个组成部分做到最高质量,因为它们直接影响画面的细节、真实感与沉浸程度。

游戏中被视为技术组成部分的大部分内容都与光照相关。不同的游戏引擎采用不同的光线传递方法。

其中一种方法叫做“环境光遮蔽”(Ambient Occlusion,AO)。

首个能够在实时环境下模拟环境光遮蔽的方法,由德国公司 Crytek 的研发部门在开发 CryEngine 2 游戏引擎的图形组件时提出。2007 年秋季发售的《Crysis》是首款基于 CryEngine 2、使用名为 SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽)的环境光遮蔽方法的游戏。屏幕空间环境光遮蔽作为一种后处理(post-effect)效果,是在屏幕空间中计算的。

如今,这项技术已用于所有现代游戏引擎。许多人低估了环境光遮蔽技术,但从重要性来看,它仅次于全局光照(Global Illumination,GI)效果。全局光照与环境光遮蔽是互补的效果,它们的任务是近似真实生活中光线多次反射与遮蔽所产生的真实辐射度(radiosity)。

GI 模拟光线如何从表面反弹到另一表面,而环境光遮蔽则近似来自 GI 的遮蔽效果。

本文重点介绍环境光遮蔽的含义、主流 AO 算法,以及它们在虚拟现实(VR)中的应用。

环境光遮蔽(Ambient Occlusion)效果示意图,展示开启 AO 前后场景深度感与立体感的差异
环境光遮蔽(AO)效果示意:开启 AO 后场景更有层次与深度,关闭则显得扁平。

什么是环境光遮蔽?

环境光遮蔽是一种用于物体全局背景或间接(indirect)阴影的着色(shading)与渲染方法。

该方法用于为画面增添真实感,因为它能制造柔和的全局阴影,有助于在视觉上分离物体。

这是一种全局方法,即物体每个点的亮度值都取决于场景中其他物体。

阴影不会保持纯黑,而是会消散,形成中间色调,并遮蔽空间中那些获得光线较少的区域。

环境光遮蔽原理示意:在表面某点构建半球并向各方向发射光线以检测遮挡
环境光遮蔽的计算原理

在大多数情况下,环境光遮蔽的计算方式是:从表面某点向各个方向构建半球射线(hemisphere of rays),然后检测这些射线是否与其他物体相交。抵达背景或天空的射线会提升该表面的亮度,而与其它物体相交的射线则不会增加亮度。

结果,被大量几何包围的点会显示为更暗,而在可见半球内几何较少的点则显示为更亮。

这意味着,遮蔽效果在任何彼此靠近的物体之间会更加明显。

未开启环境光遮蔽(AO 关闭)的游戏场景画面
关闭环境光遮蔽(Before):场景缺乏接触阴影,整体偏平。

开启环境光遮蔽(AO 启用)后的游戏场景画面,物体更具立体感
开启环境光遮蔽(After)

下面是一张环境光遮蔽的示例。可以看到,缺少它会使场景变得扁平,并失去我们大脑下意识感知的相当一部分深度。

因此,环境光遮蔽的核心思想就是:仅在我们可以直接看到的场景部分,去模拟并计算遮蔽。

主流环境光遮蔽算法

存在多种着色算法,能以不同的真实度来渲染来自全局光照的阴影。它们在开销、运行速度与输入数据类型上各有差异。

什么是屏幕空间环境光遮蔽(SSAO)?

SSAO(屏幕空间环境光遮蔽)效果示例图
SSAO(屏幕空间环境光遮蔽)效果示例:在弯曲与凹陷处可见柔和环境阴影。

SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽)是实时近似环境光遮蔽效果中对算力要求最低的计算图形技术,尽管该效果的实际质量会因开发者实现水平的不同而在各游戏间差异巨大。

这种效果在弯曲处与凹陷处可见,但在平面与凸面上不可见,因为它们彼此之间不会遮挡光线进入。该效果非常重要,因为它的缺失会让场景看起来非常扁平。

工作原理

屏幕空间环境光遮蔽的方法相当简单。在构建屏幕空间环境光遮蔽效果时,会检查屏幕上的每个点,并为每个点创建一个半球。这个半球的任务是确定该点从外部空间收集到多少光线,或周围物体在其上投下多少阴影。

为此,会在球体内进行一系列采样,以检查该点是否穿透了某种表面。如果没有穿透,则看到的是天空,该点获得额外光照。

为了检查该点是否被遮蔽,会在 Z 缓冲(Z-buffer)内构建一个半球,并检查该半球是否被 Z 缓冲遮挡。

该方法使用法线贴图(normal map)来确定构建半球所依据的曲面法线,但遮蔽程度由射线匹配(ray-matching)方法决定。深度缓冲射线采样在纹理内部进行,以判断该点在指示方向上是否被遮蔽。

当 SSAO 效果用于前向渲染(forward rendering)时,需要再次渲染整个场景,以获得法线与深度,除前向渲染期间获得的深度缓冲外,还需全屏纹理。

因此,在延迟着色(deferred shading)中,这一过程更简单,因为其中一个缓冲按逐像素方式存储了每个点的法线。

屏幕空间环境光遮蔽非常昂贵,因为对于单个点,平均需要数十次不同方向的射线追踪,以确定哪些方向可供光线进入该点、哪些不可。

因此,在纯形式下它几乎从不使用,因为开销太大。

在这方面,会采用各种方法来优化、减少采样数量。

可节省资源的其它方法

1. 将环境光遮蔽烘焙(baking)到纹理上:

这种情况下,该纹理作为应用于模型的材料(material)的一部分使用。在某些模型中,它被烘焙为 Metallic+Roughness 纹理的绿/蓝通道。如果屏幕空间方法的效果被汇总,再加上来自纹理的环境光遮蔽,就能得到更细致的阴影。该方法弥补了另一种方法——将 AO 烘焙到光照贴图(lightmap)——的不足。其缺点是,在烘焙的 AO 纹理中,不会包含来自相邻物体的阴影;实际上,该纹理中只能获得自阴影(self-shadowing)贴图。

2. 将环境光遮蔽烘焙到光照贴图上(前提是具备光照贴图):

该方法是“免费”的,因为光照贴图本来就有,但它会降低烘焙速度,并增加计算环境光遮蔽效果的额外时间。该方法更精确,因为在烘焙阶段不仅能分析附近表面,还能分析更大范围的空间,以理解射线如何移动。主要缺点是光照贴图不够细致,纹素(texel)尺寸为 1/10 或 1/20 米。这意味着烘焙到光照贴图上的 AO 只会包含最大的部分,所有细微细节都不会被烘焙。因此,这种方法只适合表现非常大的细节。

SSAO 设置

有一些参数需要加以考虑。

在某些游戏中,该参数不太明显;但在另一些游戏中,为了突出内角与空腔,会把它做得非常明显。

SSAO 相关的问题

尽管 SSAO 是一种有效的方法,但仍可能出现一些问题。

问题 1:遮蔽不足

SSAO 与 XSAO 对比图,展示 SSAO 着色不足(insufficient shading)的问题
SSAO 与 XSAO 对比:SSAO 因深度缓冲缺乏背面信息,出现着色不足(如坦克底部未被正确遮蔽)。

下面是一个遮蔽不足的示例。坦克底部本应被遮蔽,因为它本应接收较少光线,但由于深度缓冲没有背面信息,屏幕空间效果并未遮蔽这些区域。VXAO 能给出更高质量、更精确的遮蔽,因为它具备背面信息。

问题 2:来自背面或被视线遮挡几何的阴影

SSAO 没有屏幕边缘之外是什么的信息,在摄像机运动时,边缘处会出现阴影。只要 SSAO 触及屏幕边缘,就会观察到该后处理效果的闪烁。

问题 3:屏幕平面上的 SSAO

如果该效果是在屏幕平面上制作的,则应注意半径应在近处与远处物体上发生变化。

SSAO 的优缺点

优点

− 不依赖于场景复杂度。它完全只与最终图像的像素协作。
− 可用于动态场景。
− 可轻松集成到任何现代图形管线(graphics pipeline)中。

缺点

− 开销大,且直接依赖于图像分辨率。
− 图像分辨率越高,该效果越昂贵,也就越需要以减少射线数量、缩小半径来简化算法。
− 在不干扰深度不连续(例如物体边缘)的情况下正确模糊噪点很困难。

什么是基于水平线的环境光遮蔽(HBAO)?

SSAO 与 HBAO(基于水平线的环境光遮蔽)效果对比图
SSAO 与 HBAO(Horizon Based Ambient Occlusion)对比:HBAO 视觉质量更高。

HBAO(Horizon Based Ambient Occlusion,基于水平线的环境光遮蔽)是 NVIDIA 于 2008 年提出的一种近似环境光遮蔽效果的算法,作为 SSAO 的升级变体。该方法能给出更好的视觉效果,且比 SSAO 更昂贵。其原理是:HBAO 使用基于物理的算法,通过深度缓冲采样来近似一个积分(integral)。在某个表面内测量角度,并在考虑深度的同时还考虑表面法线相对于世界(水平线 horizon)的方向,来检查有多少光线会被遮挡。这样,表面的方向被额外纳入考量,以得到更精确的结果。

优点

− 图像质量高于 SSAO 算法。
− 在 NVIDIA 显卡上享有额外的硬件加速。

缺点

− 相比 SSAO 性能开销更大。
− 以降分辨率渲染 HBAO 会导致画面闪烁。

什么是 HBAO+?

SSAO 与 NVIDIA HBAO+ 效果对比图
SSAO 与 NVIDIA HBAO+ 对比:HBAO+ 细节更丰富、速度更快。

与 HBAO 相比,HBAO+ 将 AO 效果的细节级别翻倍,使用最新的 DirectX 11 技术,且运行速度快得多。其原理是:计算 HBAO+ 时使用棋盘渲染(checkerboard rendering)。处理遮蔽时,会利用前一帧的一部分与当前新帧的一半。结果,所需 GPU 开销更少,且由于遮蔽以原始分辨率渲染,闪烁也被消除。

优点

− 所需 GPU 开销更少,因此可在不降低分辨率的情况下以原始分辨率渲染遮蔽。
− 实现速度快,图像更丰富、更细致。

缺点

− 由于来自前一帧的时间累积(temporal accumulation),在动态变化的场景与突发的摄像机移动中,可注意到 AO 效果不能立即适应。

什么是高清环境光遮蔽(HDAO)?

SSAO、HBAO 与 HDAO(高清环境光遮蔽)三者对比图
SSAO、HBAO 与 HDAO(High Definition Ambient Occlusion)三者对比。

HDAO(High Definition Ambient Occlusion,高清环境光遮蔽)由 AMD 公司开发。该算法基于 Gather4 技术,能在一个寄存器中收集四个纹素(texel)。其原理是:HDAO 与 HBAO 已被归纳为相同思路——它们有相似的工作原理,即增加计算应被遮蔽区域时所使用的采样数,并以全分辨率渲染,以更精确地表现 AO。

优点

− 在 AMD 显卡上享有额外的硬件加速。

缺点

− 该算法专为 AMD 显卡设计;而根据 Steam 硬件与软件调查(Steam Hardware & Software Survey),AMD 显卡远不如 NVIDIA 显卡普及。

什么是体素加速环境光遮蔽(VXAO)?

HBAO+ 与 VXAO(体素加速环境光遮蔽)效果对比图
HBAO+ 与 VXAO(Voxel Accelerated Ambient Occlusion)对比:VXAO 最精确。

VXAO(Voxel Accelerated Ambient Occlusion,体素加速环境光遮蔽)是一种处理体素(voxel)——即三维中的像素等价物——的方法。DirectX 12 允许进行重新追踪(retracing)并将场景体素化(voxelizing)到搜索结构中。

借此,可以得到一种更精确、能考虑更复杂场景几何的方法。然而,该方法比其它方法更昂贵。VXAO 是 VXGI(Voxel Global Illumination,体素全局光照)环绕光照技术的一部分,能更正确地考虑直接光与反射光。其原理是:VXAO 算法包含三个流程——体素化、体素后处理(voxel post-processing)与锥体追踪(cone tracing)。体素化意味着将基于三角形的网格(mesh)渲染进一张三维纹理。

其性能取决于三角形的总数、尺寸,以及渲染它们所需的绘制调用(draw-call)数量。后处理包含清除、过滤与降采样(downsampling)体素等过程,其性能取决于体素化阶段产生的体素总数。随后在屏幕空间进行锥体追踪,其性能取决于着色率(shading rate)、屏幕分辨率,以及 1080p 分辨率下的锥体追踪流程。

优点

− 提供最精确的遮蔽。
− VXAO 能很好地处理动态场景。

缺点

− 只有高端 GPU 才能充分发挥其优势。
− 视实现方式不同,VXAO 可能比 HBAO+ 慢 3–4 倍。
− 需要最新的 GTX 显卡。

AO 算法在虚拟现实中的应用

在虚拟现实中,SSAO 非常重要,但不如普通游戏那么重要。这是由于立体视觉(stereo vision)的影响。

环境光遮蔽在虚拟现实(VR)中的应用与注意事项示意图
环境光遮蔽在虚拟现实(VR)中的应用:受立体视觉与视差影响,屏幕空间 AO 在两眼间结果不一致。

在虚拟现实的立体视觉中,我们的大脑从两幅立体图像重建出深度缓冲,从而“看到”深度。图像中物体偏移越多,离观看者越近,大脑便实际接收到深度信息并加以识别。

因此,与显示器上没有深度信息、需要靠 AO 等效果来强调深度的 PC 游戏不同,在 VR 中,即使没有 AO 效果,观看者也能理解场景深度,对它的需求要小得多。

此外,由于视差(parallax),双眼感知到的图像略有不同,而 SSAO 因其屏幕空间特性,会为双眼生成略有不同的结果。它们让 AO 显得“虚幻”,因为每只眼看到的 AO 结果并不匹配。因此,在较大的 AO 半径下,它甚至会造成糟糕的整体画面印象并破坏沉浸感。

另一方面,所有屏幕空间效果都依赖于分辨率——分辨率越高,对性能的影响越大,尤其是像 AO 这样“沉重”的效果。

虚拟现实的一个特征是会渲染超高分辨率的图像,而主要的限制问题是显卡的填充率(fill rate)低下。因此,启用 SSAO 效果可能使 FPS 下降近两倍。

Unity 中的环境光遮蔽

ARVI 测试了 Unity Asset Store 上许多可用的 AO 算法,得出以下结论。测试在 Dragon 场景上进行(GTX 970 的 FPS),所有效果均使用默认参数:

标准电影级效果(standard cinematic effects)来自 Unity,会使 FPS 从 146 降至 126;amplify occlusion 使 FPS 下降极小(从 146 到 144);SESSAO 将 FPS 降至 126;SSAO Pro(最快的算法之一)将 FPS 降至 144;TSSAO 将 FPS 从 146 降至 99。这些效果在 VR 中不支持 Single 与 Multi 通道。

对于 VR,Amplify Occlusion 2.0 是个不错的方案。正如其所述:“Amplify Occlusion 2.0 完全放弃基于 HBAO 的技术,转而采用更优的 Ground Truth Ambient Occlusion(GTAO,ground truth 环境光遮蔽),使质量与精度更接近传统光线追踪。”

该方法支持 VR Single 与 Multi 通道,并提供高质量、快速的运行时间与性能提升。

另外,也可以关注 Unity 在 PostProcessing Stack v2 中对 AO 的新实现,它具备许多有趣的特性,例如按尺度(scale-wise)的 AO。

总结

因此,哪怕是最简单的 AO 算法,也胜过完全不使用它。

我们对 DX12 与 NVIDIA RTX 显卡的光线追踪(ray-tracing)新特性感到非常兴奋。未来,AO 方法似乎将走向完全动态的射线追踪,而非基于深度缓冲的射线步进(ray marching)。

我们最终的推荐如下:

如果电脑在没有 AO 时也能很好地运行游戏,那么可以选择 SSAO 或最低画质的 HBAO,以节省更多性能。通常这些方法使 FPS 下降不超过 10%。

如果性能允许,则 HBAO+ 或 HDAO 是可选方案。如果拥有顶级显卡,则选用 VXAO 算法。

交互式对比

《Just Cause 3》关闭 SSAO 时的画面(Before)
《Just Cause 3》关闭 SSAO(Before):画面偏平,缺少环境接触阴影。

《Just Cause 3》开启 SSAO 后的画面(After)
《Just Cause 3》开启 SSAO(After):接触阴影出现,场景更真实。

《Gears of War 4》环境光遮蔽最高画质(Ultra)画面(Before)
《Gears of War 4》环境光遮蔽最高画质 Ultra(Before):遮蔽细腻、过渡自然。

《Gears of War 4》环境光遮蔽低画质(Low)画面(After)
《Gears of War 4》环境光遮蔽低画质 Low(After):遮蔽减弱、出现噪点。

《Assassin's Creed Syndicate》仅 SSAO 的遮蔽(AO only)效果(Before)
《Assassin’s Creed Syndicate》仅 SSAO 的遮蔽效果 AO only(Before)。

《Assassin's Creed Syndicate》仅 HBAO+ 的遮蔽(AO only)效果(After)
《Assassin’s Creed Syndicate》仅 HBAO+ 的遮蔽效果 AO only(After):质量更高。

《Tom Clancy's The Division》NVIDIA HBAO+ 遮蔽效果(Before)
《Tom Clancy’s The Division》NVIDIA HBAO+ 遮蔽效果(Before)

《Tom Clancy's The Division》低画质遮蔽效果(After)
《Tom Clancy’s The Division》低画质遮蔽效果(After):阴影简化。

《Tom Clancy's The Division》NVIDIA HBAO+ 遮蔽效果(Before,另一组对比)
《Tom Clancy’s The Division》NVIDIA HBAO+ 遮蔽效果(Before,第二组对比)。

《Tom Clancy's The Division》最高画质遮蔽效果(After,Ultra)
《Tom Clancy’s The Division》最高画质 Ultra 遮蔽效果(After)
NVIDIA VXAO 仅遮蔽(AO only)效果(Before)
NVIDIA VXAO 仅遮蔽(AO only)效果(Before):精度最高。
NVIDIA HBAO+ 仅遮蔽(AO only)效果对比(After)
NVIDIA HBAO+ 仅遮蔽(AO only)效果(After),与 VXAO 对照。

评论留言