Origin
zhuanlan.zhihu.com
Tags
简悦
项目
收藏夹
创建时间
收藏类型
Cubox 深度链接
更新时间
原链接
描述
01 背景介绍
随着游戏行业的不断发展,广大玩家对游戏品质的需求也越来越高,内容层面上从 2D 休闲场景过渡到 3D 开放大世界的潮流,持续推高着游戏的制作水准。
尤其是近两年来,在移动游戏范畴内不断有能全面媲美主机游戏的现象级产品涌现。这一趋势进一步提醒人们,场景的美术效果是对游戏品质影响最大的要素之一,而这其中的全局光照(GI)就堪称游戏技术 “皇冠上的明珠”。传统全局光照解决方案中常见的静态贴图或者光照探针方案虽然成熟,却已越来越难以应对动态变化的场景。虽然在主机和 PC 平台上有着诸多可供选择的动态 GI 解决方案,但就目前手机硬件的热工耗限制而言,完美移植尚存挑战,短期内难以脱离纸上谈兵的窘境。通盘考虑移动平台的特性,诸如功耗性能、存储限制,以及兼容性要求后,腾讯游戏技术团队提出了一套在现有手机平台上效果与性能均能投入实用的动态 GI 方案,构建了基于 PRT 的实时 GI 渲染引擎。
目前在主机和 PC 平台有不少动态 GI 被成功应用于游戏项目的尝试,如基于桌面显卡硬件特性提供的 RTXGI,以及 Lumen 动态 GI 与反射软件解决方案等,都表现不凡,各有千秋。不过需要指出的是,这些方案对底层硬件的绝对性能和功耗等需求都比较高,无法立即满足移动平台的高能效要求。可喜的是,以 Arm Immortalis-G715 为代表的旗舰级移动 GPU 已经在尝试硬件 Ray Tracing 加速方案,与此同时短期内相关产品的定位仍限于服务于高端产品线。作为专业的游戏开发者,在被这些新技术的问世不断鼓舞的同时,亦不会忘记思考如何尽快降低推广最前沿技术成果的硬件门槛,并对 Mali 这样的主流 GPU 产品线也提供足够的优化与支持
02 什么是全局光照(Global Illumination)
全局光照(Global Illumination, 简称 GI), 作为计算机图形学中最为引人注目的概念之一,是指同时考虑来自光源的直接光照,以及经由其他物体反射或折射后的间接光照从而大幅提升画面真实度的一种高阶渲染技术。
即可以理解为:全局光照 = 直接光照 (Direct Light) + 间接光照 (Indirect Light)
其中直接光照的部分计算方法相对比较直观(可以通过使用光栅化结合 shadowmap 的方法快速得出结果,截图来自 Epic 官方 Demo Lightroom)。
然而间接光照的计算由于算力需求巨大目前在大部分设备上还无法实时完成,尤其是要想在移动端设备上直接完成全部相关计算,其性能和功耗上的挑战是难以想象的。下图中红色箭头所指部分就是场景中没有被光源直接照射到的间接光渲染覆盖区域:
因此目前市场上的手机游戏中使用的基本上都是基于预计算的全局光照技术。其中尤以离线烘焙光照贴图的方式最为常见,如下面场景中左侧的是使用 lightmap 之后的光照效果,右侧则是生成的 lightmap 贴图的可视化方式。
使用 lightmap 光照贴图的好处是能够以极高的性能在移动端实现高质量的光照效果,但同时也存在显著的局限性,比如场景和光照都必须是静态的,要想实现同一个场景在不同时段和光照条件下的逼真效果,美术人员就必须烘焙多套 lightmap 光照贴图,这就为存储量本有限的移动端设备带来了更多挑战。因此为了在移动端实现高性能、高质量的动态全局光照,我们提出了一套自己的光照方案:即基于 PRT 的 GI,并围绕 PRT 的实现细节独创了多种优化方案,解决了局部光源动态变化、大场景的数据存储、以及室内场景漏光等诸多的技术难题。
如下面为了演示白天和夜晚不同时段的光照效果,传统方案都需要烘培两套 lightmap 光照贴图,这会在游戏制作周期和移动端存储容量两方面都带来双倍的压力。
即便有些游戏项目可以承受更多的烘焙与存储成本,但为了处理像下面这样的包含任意时段连续变化光照的场景,额外代价往往不止 2 倍开销,而很可能必须烘焙 8 套,甚至更多的光照贴图才足够。
03 PRT 是如何实现动态全局光照的
● 首先什么是 PRT 呢?
PRT 英文全称是 Precomputed Radiance Transfer,翻译过来就是预计算的辐射度传输。从名字上面就可以看出 PRT 也是一种预计算技术,但是它并没有直接保存光照的具体结果,而是存储光线传输过程的数据呈现。PRT 方法最初在 2002 年 Siggraph 会议期间由 Peter-Pike Sloan 首先提出,并从此掀起了一波 PRT 实现方法的研究浪潮。当时 Peter-Pike Sloan 论文所实现的 PRT 算法便是基于球谐(SH)的,实际上 PRT 不仅可以通过 SH 去表示低频环境光场景,还可以有其它方法(如 Wavelet)。
● PRT 是如何实现动态全局光照的呢?
PRT 实现动态全局光照的解决方案通常主要是由离线光照传输烘焙和实时光照重建两个部分组成。
在介绍离线烘焙和实时重建的具体实现方法前我们先介绍一下这两部分都会用到的一种数学工具
● 球谐函数
我们前面提到了 PRT 实际上预计算的是光照的传输过程,那这个传输过程是通过什么样的形式保存下来的呢?答案是我们使用了 SH (球谐函数)拟合了来自球面各个方向的光照计算结果,这样在光照重建时我们只要知道当前的光照来自哪个方向,强度是多少,然后与这个方向的传输记录结合就能计算出当前最终的光照结果了。
那么什么又是球谐函数呢?首先我们看下对于任意函数 () ,不管是连续的还是不连续的,我们都可以展开形成一系列基函数 () 的线性组合: ( )=∑ ⋅ ( ),其中 为系数。在一维空间中可以使用傅立叶变换将 ( ) 表示成另一系列基函数(各种频率的正弦谐波)的线性组合 (图片来源 Wikipedia):
而球谐(Spherical Harmonics,SH) 便是定义在球面上的一系列 2D 基函数,它与 2D 傅里叶序列有点相似,特别的是非常适合球面函数:
● 离线的光照传输函数烘焙
在有了如何存储光照传输函数的方法后,我们需要去考虑如何计算每个点的传输函数的基函数的系数。由于我们使用的是球谐函数,而它的每个基都是正交基,因此我们直接把球面上面每个方向对球谐基函数做投影就可以得到对应的球谐系数。
● 实时光照重建
在重建光照之前,我们需要将光源用球谐函数表示出来,方法就是将光源投影到 SH 的每个基函数上面,接着得到球谐函数的系数向量。然后与预计算得出的光照传输函数相乘就得到了最终光照结果:
04 PRT 动态光照在移动端上面的挑战
虽然 PRT 能够很好地实现动态光照效果,如昼夜变换,但是此前 PRT 的实现和应用还仅限于 PC 和主机游戏。这是因为 PRT 技术在手机上的推广存在诸多技术挑战。下面我就给大家具体介绍一下这些问题以及我们的 PRT 实现拥有什么样的突破,从而使得 PRT 这种源自 PC 的动态光照技术最终能在移动端得以完美呈现。
PRT 计算相关的数据通常有三种存储形式:mesh vertex,surface lightmap,以及 light probe。
● 首先会遇到的问题是数据量爆增的问题:
使用 vertex 和 lightmap 来存储 PRT 数据均会遇到数据量的暴增,以 2 阶球谐系数为例,单个像素或者顶点需要使用 4 x 3 = 12 个系数来存储,静态的 lightmap 通常只需要 3 个系数,这样数据量就增加到了原来的 4 倍,如果使用 3 阶球谐数据量会增加到 9 倍。这种存储对手机来说是个比较大的难题。因此为了规避数据暴增我们使用了 adaptive sparse light probe 来存储 PRT 数据.
● 其次就是使用 light probe 重建光照时的漏光问题
在使用 light probe 进行光照计算时,位于物体表面的点常常无法判定附近的 light probe 是否可见,很容易出现室内的墙面采样到室外的 light probe 的情况,从而在视觉上造成漏光现象。这种情况对于玩家是种非常糟糕的体验。
目前有一些处理漏光的方法,例如在 DDGI 算法中(Dynamic Diffuse Global Illumination)中做出的基于 depth 的尝试,但是这种方案又会再次带来数据量和性能方面的挑战,所以仍无法很好处理移动端的 light probe 漏光问题。
● 然后是烘焙时间超长的问题
在进行离线 PRT 预计算时,相对小的场景所耗费的时间通常不是个大问题,但是对于那些 1km 以上的开放场景,完成预计算的时间可能会长达数小时甚至更久。因此我们对于如何尽可能减少超长的预计算时间提出了一种崭新的思路。
腾讯游戏 CROS 的 PRT 技术团队深入分析和调研了现有的多种技术方案,并反复实验打磨,终于构建出了一个可以突破各种固有局限的技术体系,从而解决了上述提到的存储过大,烘焙时间过长,漏光明显等诸多问题,相较于现存备选方案具备一系列的显著优势。
05 腾讯游戏 CROS 的 PRT 动态光照方案的技术优势
● 使用 PRT GI 后玩家可以在手机上流畅地欣赏全天候的动态昼夜变化,享受丰富的游戏光影效果。
● PRT GI 对移动端的性能损耗非常低,几乎没有额外性能开销。
目前我们项目组的实际测试显示,可以将 PRT 动态全局光照的计算开销降到极低的水平,几乎不带来任何额外开销,从而在大多数移动端设备上面都可以达到 30~60FPS,同时我们针对一些 Mali GPU 的架构特点,尽量使用 Fragment Shader 替换 Compute Shader 完成大量的复杂运算,从而最大限度保证了图形硬件管线运行的高度并发性。
● 使用了多种形式的存储和数据压缩方案,比使用传统的 lightmap 存储需求更低。
● 腾讯 WeTest 上进行地测试证实该方案可以兼容市场上 90% 以上的移动设备。
● 使用分布式 GPU 烘焙技术大幅加速 PRT 预计算数据地生成。
06 与同类型 PRT 方案相比较的技术突破
● 我们独创的基于掩码(Mask)的漏光处理方案,完美解决了由于 light probe 无效采样导致的漏光问题,并且可以完美做到平滑的区域过渡。
使用 Mask 方案后的全新漏光处理效果,可以看到肉眼可见的漏光问题不复存在,并且在房间过渡处光线表现也很自然。
相较于基于 division 的包围盒方案,我们在房间过渡处的光线处理看起来明显更为自然,下面是 division 使用包围盒处理漏光前后的对比,可以看到室内和室外的光照亮度跳变非常明显。
● 我们实现了基于混合结构的 PRT 数据存储方案,让 PRT 的光照效果和数据存储可以达到一个完美的平衡。
● 我们实现了 PRT 对 Local Light 的低存储高性能动态变化支持。
07 相关引用与参考文献
● Precomputed Radiance Transfer: Theory and Practice:http://www0.cs.ucl.ac.uk/staff/j.kautz/PRTCourse/
● Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments: https://jankautz.com/publications/prtSIG02.pdf
● Global Illumination in Tom Clancy’s The Division: http://mrakobes.com/Nikolay.Stefanov.GDC.2016.pdf
● Moving Basis Decomposition for Precomputed Light Transport: https://research.activision.com/publications/2021/09/moving-basis-decomposition-for-precomputed-light-transport
● Precomputed Global Illumination in Frostbite: https://www.ea.com/frostbite/news/precomputed-global-illumination-in-frostbite
● Modeling Illumination Variation with Spherical Harmonics: https://cseweb.ucsd.edu/~ravir/lighting.pdf
▎本文由 简悦 SimpRead 转码。