什么是环境光遮蔽?都有哪些算法?又为何对AR/VR非常重要?
文章相关引用及参考:arvilab
本文介绍了环境光遮蔽及其衍生版本
(映维网 2018年12月10日)每一年,开发者都在尝试为每一个游戏组件最高的质量,因为它们直接影响细节,图像逼真度和沉浸感。
游戏中大多数的技术组件都与光线有关,而各种游戏引擎都在利用不同的方法来传输光线。其中一种方法是“环境光遮蔽(Ambient Occlusion;AO)。
第一种允许实时模拟环境光遮蔽的方法由德国Crytek研发,主要用于CryEngine 2。于2007年秋季发行的《孤岛危机》是CryEngine 2游戏引擎首款采用环境光遮蔽方法SSAO(屏幕空间环境光遮蔽)的游戏。屏幕空间环境光遮蔽方法用作后期效果,并且在屏幕空间中计算。
今天,所有的现代游戏引擎都支持这项技术。许多人低估了环境光遮蔽技术,而从重要性来看,它仅仅落后于全局照明(Global Illumination;GI)效果。全局照明和环境光遮蔽是互补效果,它们的任务是近似光线多次反射和着色的真实光能传递效果。
GI模拟光线如何从表面反射至另一个表面,而环境光遮蔽近似于GI的阴影效果。
在本文中,ARVI Lab将向我们分享环境光遮蔽的意义,主要的AO算法,以及它们在虚拟现实的应用。以下是映维网的具体整理:
1. 什么是环境光遮蔽
环境光遮蔽是用于全局背景或对象间接着色的着色和渲染方法。这种方法可以为渲染添加更多的真实感,因为它能够创建柔和的全局阴影,从而有助于对象的视觉分离。
这是一种全局方法,即对象每个点的亮度值取决于场景中的其他对象。
阴影不会保持黑色,它们会消散,产生半色调,并遮蔽空间中光线较少的位置。
在大多数情况下,这主要是通过构建从表面上一点朝所有方向发出的半球射线,然后检查它们与其他对象的交叉来计算环境光遮蔽。到达背景或天空的光线会增加表面的亮度,而穿过其他对象的光线不会增加亮度。
结果是,被大量几何体围绕的点显示为较暗,而周围只有少量几何体的点则显示为较亮。
这意味着彼此靠近的任何对象之间的阴影效果将更加明显。
没开启AO
开启AO
这是环境光遮蔽的一个例子。如你所见,没有开启Ambient Occlusion的情景更加缺乏层次感,并且缺乏我们大脑潜意识所能感知的深度部分。
因此,环境光遮蔽主要是仅在我们直接看到的那部分场景中模仿和计算阴影。
2. 主要的环境光遮蔽算法
有一系列的着色算法可以从全局照明中提供不同程度的逼真阴影渲染。它们的成本,操作速度和输入数据类型不同。
2.1 什么是屏幕空间环境光遮蔽(SSAO)?
SSAO(屏幕空间环境光遮蔽)是用于实时近似环境光遮蔽效果的要求最低的计算机图形技术。但根据开发者实现的效果,实际质量可能因游戏而异。
这种效果在弯曲处和凹陷处可见,但在平面和凸面上不可见,因为它们不会阻挡彼此的光线。这种效果非常重要,因为没有它的存在将会令场景缺乏层次感。
2.2 操作原则
屏幕空间环境光遮蔽方法非常简单。在构建屏幕空间环境光遮蔽效果时,检查屏幕上的每个点,并创建每个点的半球。这个半球的任务是确定这个点从外部空间采集了多少光线,或者周围对象有多少阴影落在它上面。
为此,在球体中制作一系列样品,并检查该点是否穿透某种表面。如果没有穿透,则天空可见,然后这一点将得到额外的光线。
为了检查该点是否有阴影,在Z缓冲区内建立一个半球,并检查该半球是否被Z缓冲区遮蔽。
对于这种方法,法线贴图用来确定相对于构建半球的曲面的法线,但阴影由Ray-Matching确定。在纹理内部进行深度缓冲光线采样,从而判断该点是否在指示的方向上着色。
当SSAO效果用于正向渲染时,除了在正向渲染期间获得的深度缓冲之外,还应再次渲染整个场景以获得法线和深度,以及全屏纹理。
因此,这个过程在延迟着色中更加简单,因为已经存在一个逐像素存储每个点的法线的缓冲区。
屏幕空间环境光遮蔽的计算成本非常昂贵,因为对于单个点,平均需要不同方向上的数十个光线追踪,从而确定光线可以从哪个方向穿透该点。
因此,纯粹形式的屏幕空间环境光遮蔽几乎从未应用过,因为它的成本很昂贵。
在这一点上,引擎采用不同的方法来优化所用样本数量的减少。
- 隔行扫描采样会导致伪影,因为在某些像素中会发生光线追踪,但在其他像素中则不会发生。
- 使用下采样,不是针对原始图像,而是缩小一半的图像,然后拉伸纹理,但它看起来很模糊。
- 暂存累积以重复使用先前帧的计算。
2.3 可以节省资源的其他方法
- 将环境光遮蔽烘焙到纹理上:在这种情况下,纹理用作应用于模型的一部分材质。在某些模型中,它将烘焙为Metallic+Roughness纹理的绿/蓝通道。如果将屏幕方法的效果加起来,则将纹理的环境光遮蔽添加到其中,然后获得更详细的阴影。这种方法弥补了另一种方法的缺点:将AO烘焙到光照贴图上。这种方法的缺点是,在烘焙的AO纹理中相邻对象不会有阴影。实际上,在该纹理中只能获得自阴影贴图。
- 将环境光遮蔽烘焙到光照贴图上,前提是光照贴图可用: 这种方法“无需成本”,因为光照贴图可用,但它会降低烘培速度,并增加额外的时间来计算环境光遮蔽效果。这种方法更准确,因为在烘焙阶段,不仅可以分析附近表面,而且可以分析更大的空间,从而了解光线是如何移动。主要缺点是光照贴图不是非常详细,而纹理像素的大小是1/10米或1/20米。这意味着烘焙到光照贴图上的AO将仅包含最大部分,而所有次要细节都不会被烘焙。因此,这种方法仅适用于传输非常大的细节。
2.4 SSAO设置
我们应该考虑一定的参数。
- 球体或半球半径。光线采样将在其中执行,半径越大,AO效果就越弱。
- 光线的密度直接影响效果的高成本。
- 阴影强度:用来相乘的乘数。
在一些游戏中,这个参数不是十分明显,但在其他游戏中,为了突出内角和腔洞,它会变得非常明显。
2.5 与SSAO相关的问题
尽管SSAO是一种有效的方法,但它同时带来了一定的问题。
- 问题1:着色不足
这是一个着色不足的例子。坦克底部需要着色,因为它接收的光应该很少,但由于深度缓冲区没有关于背面的信息,屏幕空间效果不会遮蔽这些区域。 VXAO提供更高的质量,并且由于存在关于背面的信息,因此可以获得更准确的着色。
- 问题2:背面阴影或任何遮挡的眼睛几何形状
SSAO没有超出边缘的信息,并且在camera运动期间,边缘处出现阴影。当SSAO触及屏幕的边缘时,无论是哪个位置,那里都会出现这种后期效果的闪烁。
- 问题3:屏幕平面的SSAO
如果在屏幕平面上产生这种效果,则应考虑到近距离和远距离对象的半径应该发生变化。
2.6 SSAO:优缺点
优点
- 它不依赖于场景复杂性。它仅需要最终图像的像素。
- 适用于动态场景。
- 它可以轻松集成到任何现代图形管道之中。
缺点
- 成本昂贵,直接取决于图像分辨率
- 图像分辨率越高,这一效果的成本就越昂贵,并且越加需要通过减少光线数量和减小半径来简化算法。
- 很难在不干扰深度不连续区域的情况下正确模糊噪点,比如说对象边缘。
3. 什么是水平基准环境光遮蔽(Horizon Based Ambient Occlusion;HBAO)?
HBAO是一种用于近似环境光遮蔽效果的算法,是英伟达在2008年提出的一种SSAO衍生版本。这一方法提供了更好的视觉效果,但成本比SSAO更高。
优点
- 图像质量高于SSAO算法
- 英伟达显卡提供了额外的硬件加速
缺点
- 与SSAO相比,它会令性能下降。
- 降低分辨率渲染HBAO会导致图像闪烁。
4. 什么是HBAO +?
与HBAO相比,HBAO+加倍了AO效果的细节水平,采用了最新的DirectX 11技术,运行速度更快。
为了计算HBAO+,将采用棋盘渲染。为了处理阴影,使用前一帧的一部分和新帧的一半。因此,GPU成本更少,而且因为是以原始分辨率渲染阴影,这解决了闪烁问题。
优点
- 更少的GPU成本,因此能够以原始分辨率渲染阴影。
- 它支持快速实现,提供了更丰富,更细腻的图像。
缺点
- 由于前一帧的暂存累积,你在动态变化场景和突然的camera运动过程中可能会注意到AO效果无法立即适配。
5. 什么是高解析度环境光遮蔽(High Definition Ambient Occlusion;HDAO)?
HDAO由AMD开发。这种算法基于Gather4技术,亦即在一个寄存器中采集四个纹素。
HDAO和HBAO大致相同,它们的操作原理类似。HDAO增加了在计算应该变暗的区域时所使用的样本数量,并以全分辨率渲染,从而更准确地呈现AO。
优点
- AMD显卡提供额外的硬件加速
缺点
- 这个算法专为AMD显卡设计,而根据Steam硬件和软件调查数据,AMD显卡的流行程度远不如英伟达显卡
6. 什么是体素加速环境光遮蔽(Voxel Accelerated Ambient Occlusion;VXAO)?
VXAO是一种适用于体素的方法(体素相当于3D中的像素)。DirectX 12支持在搜索结构中对场景进行回溯和体素化。
通过这样做,我们可以获得一种考虑到更复杂场景几何的,稍微更准确的方法。但这种方法比其他方法成本更高。VXAO是VXGI(体素全局照明)技术的一部分,它更准确地考虑了直射和反射光。
VXAO算法包括三个过程:体素化,体素后处理和锥形追踪。体素化意味着将基于三角形的网格渲染为3D纹理。
它的性能取决于三角形的总数,它们的大小,以及渲染它们所需的绘制调用次数。后处理涉及清除,过滤和下采样体素的过程,其性能取决于体素化过程中产生的体素总数。体素锥形追踪在屏幕空间中进行,其性能取决于着色率,屏幕分辨率和1080p分辨率的锥形追踪通道。
优点
- 提供最准确的着色。
- 能很好地处理动态场景。
缺点
- 只有高端显卡才能充分利用这种算法。
- 根据实现效果,VXAO可能比HBAO+慢3-4倍。
- 它需要最新的GTX显卡。
7. 虚拟现实的AO算法应用
SSAO在虚拟现实中非常重要,但不如它对普通游戏的重要性。这是由于立体视觉的影响。
利用虚拟现实中的立体视觉,我们的大脑可以感知深度缓冲,并根据两个立体图像进行重建。
PC游戏有所不同,显示屏不存在深度信息,所以需要像AO这样的效果来强调深度。在VR中,即使没有AO效果,用户也能理解场景的深度。
最重要的是,由于视差影响,眼睛感知到略微不同的图像,而由于其屏幕空间特性,SSAO会为它们产生略微不同的结果。当每只眼睛看到不匹配的AO结果时,它们会使AO看起来“虚假”。因此在较大的AO半径中,它甚至可以产生不好图像印象,并打破沉浸感。
另一个方面是所有屏幕空间效果都取决于分辨率。分辨率越高,它们对性能的影响就越大,尤其是像AO这样的“重度”效果。
虚拟现实的一个特征是需要渲染高分辨率的图像,而主要的约束问题是显卡的低填充率。因此,包含SSAO效果会令FPS降低近两倍。
8. Unity环境光遮蔽
ARVI测试了Unity Asset Store中的一系列AO算法,并得出以下结论。测试是在Dragon场景(FPS for GTX 970)上进行,所有效果都是默认参数:
- 无影响:146 FPS;
- TSSAO:99 FPS;
- SSAO Pro:144 FPS;
- SESSAO:126 FPS;
- Cinematic Image Effect AO:126 FPS;
- Amplify Occlusion:144 FPS。
因此,Unity标准的Cinematic Image Effect将FPS从146减少到126;Amplify Occlusion对FPS的影响微不足道(从146减少到144);SESSAO将FPS降低到12;SSAO Pro(它是最快的算法之一)将FPS降低到144;TSSAO则将FPS从146降低到99。
这些效果不适用于VR中的单通道和多通道。
对于VR而言,Amplify Occlusion 2.0是一种优秀的解决方案。如其所属,“Amplify Occlusion 2.0完全终止了基于HBAO的技术,并转向了更优秀的Ground Truth Ambient Occlusion(GTAO),从而令质量和精度更接近传统的光线追踪。”
这种方法支持VR单通道和多通道,并提供高质量,快速的运作时间和性能提升。
另外,你可以了解一下Unity在PostProcessing Stack v2中的最新AO实现,它提供了许多有趣的功能。
9. 总结
因此,即便是最简单的AO算法,能用就用,而不是根本不予以使用。
我们对DX12和RTX显卡的光线追踪功能感到非常兴奋。在未来,AO方法将朝着全动态光线追踪的方向前进,而非Depth-Buffer Ray Marching。
我们最终的建议如下:
- 如果你的PC在不开启AO的情况下都能流畅运行游戏,你可以选择质量最低的SSAO或HBAO来节省更多的性能。通常而言,它们对FPS的降低幅度不超过10%。
- 如果性能允许,HBAO+或HDAO是一个可行选择。如果你的PC搭载了一枚高端显卡,建议你选择VXAO算法。
10. 对比
[ics-comparison-slider id=11]
未开启AO vs 开启AO
[ics-comparison-slider id=12]
Ambient Occlusion Low vs Ambient Occlusion Ultra
[ics-comparison-slider id=18]
SSAO vs HBAO+
[ics-comparison-slider id=19]
HBAO+ vs Ambient Occlusion Low
[ics-comparison-slider id=20]
HHBAO+ vs Ambient Occlusion Ultra
[ics-comparison-slider id=22]
VXAO vs HBAO+