引
实时全局光照是计算机图形学领域的终极问题之一,是渲染高质量、高保真画面的不二法门,也是无数优秀的科学家和工程师绞尽脑汁不断尝试触摸的圣杯。全局光照分为直接光照和间接光照两个部分,直接光照的计算非常简单且有成熟的方案,而间接光照的计算则相对困难




计算直接光照需要先来一发 shadowmap 以获取着色点的光源可见性,对于能够见到光源的点直接带入光照模型即可。而计算间接光照最直观的方法是对每个着色点进行光线追踪,通过向场景发射光线,模拟光线的反弹并记录沿途的信息,我们能够计算着色点所受到的来自整个场景的照明:

然而光线追踪算法有着巨大的计算开销,这使得光线追踪算法(在硬件捉襟见肘的年代)只能运用于影视等离线场合。随着现代计算机计算与存储能力的提升,人们开始琢磨着如何将全局光照引入实时计算机游戏中。
光线追踪求解的是着色点表面所受的辐照度,一种古老而经典的做法是对场景的每个 ”表面“ 离线进行光线追踪,然后将光线追踪的结果(本质上是 RGB 值)存储到一张大的贴图中,这张贴图叫做 Lightmap。在运行时只需要进行一次纹理采样就能够得到特定着色表面的全局光照信息:

诚然,没有所谓的 silver bullet,lightmap 也并不是全能的 Atlas 巨神。lightmap 最大的问题就在于它要求场景内的物体和光源都是静态的,一旦光源或者场景物体发生移动或者旋转就得不到正确的结果。此外动态的物体也无法享受到 lightmap 烘培的 GI
好在大多数游戏的室内场景中光源和物体都相对固定,因此 lightmap 在大多数情况下都是 work 的。但是随着大型游戏对场景开放性的要求逐渐提高,开始出现日月轮替、更多的动态物体等需求,我们急需一种新的光照方案作为对 lightmap 的补充和延展。
理论:
光线的传播从光线追踪的视角来看,可分为 **光线与场景求交,光照计算 **两个步骤。对应渲染方程形式为:
其中
这两个步骤中 光线和场景求交开销之大以至于难以实时运行,光照计算只需要将物体表面属性带入 phong、PBR 等光照模型,相对开销较小。预计算辐照度全局光照(Precomputed Radiance Transfer Global Illumination)巧妙地将实时光线追踪中的性能瓶颈 步骤下放到离线进行求解,能够渲染出 “受限制” 的全局光照结果。PRTGI 将光线追踪的两个步骤拆分开来运算:
- 首先 离线 计算光线的传输过程(即光线和场景求交)并保存计算光照所需的法线、位置等必要几何信息
- 在 运行时 读取预计算的场景几何信息并计算实时光照(这一步也叫做 ReLight)
在 lightmap 方案中,光照的传输与计算都发生在离线。而 PRT 的光照计算发生在运行时,这意味着 PRT 带来的 GI 能够实时地响应动态的光源:
但因为光线传输的过程发生在离线,所以动态物体只能接受 GI 的照明而不能给周围的物体产生 GI 影响,这也是 PRTGI 的 “限制” 之处。
简化考虑:只计算第一次反弹
“Send Cerebra Only(只送大脑)。”——托马斯·维德 出自:刘慈欣《三体》,这是在火箭技术不足以运输完整冷冻人体的情况下向三体舰队发送活人标本的方案。尽管这个疯狂的方案充斥着妥协与无奈,但也包含了一往无前的冷酷和决绝。
同样的,在实时渲染领域也包含了大量的妥协。既然全局光照中间接光的 N 次反弹我们算不来,那就只计算第一次反弹!一次反弹之后得到的所有 B 点作为间接光源以照亮 A 点:

光线追踪是一个递归函数,假设用
因为 我们 只考虑一次反弹,那么不需要考虑 B 点的间接光照
这个式子翻译成人话就是,计算 A 点的全局光照我们需要:
- 计算 A 点受到的直接光照
- 从 A 点发射若干向量,和场景相交得到点集
- 对点集 中的每个点 B,计算 B 点的直接光照
- 将 1 和 3 的结果相加
计算着色点 X 的直接光照
经过一系列的妥协,全局光照的运行时计算代价被简化为了两次直接光照的计算。对于点集
直观的过程理解
简而言之 就是在 场景中均匀的撒采样探针 probe, CubeMap捕获周围的 Albedo, Normal ,WorldPostion,通过 SH 球谐系数进行离线存储 radiance【体素存储,3D 查找表】,在实时 Relight Pass 中Decode SH 系数,计算 环境直接光照 和一次间接光照的环境漫反射结果,并通过时域累加来获得光线多次弹射的结果,进而实现 GI,增强阴影处的光照效果。
也就是 SH 球谐函数在全局光照上的应用案例。
缺陷:
因为 surfel 是离线烘的,所以 PRTGI 不适用于实时的场景破坏;不支持动态物体的变化,对静态场景友好,支持动态光照效果【Light Map 只能静态光源,静态场景】。
因为采样点的散布,存在漏光问题,需要工程解决。(简单的法线权重 blend 其实并不能够很好的解决漏光、漏影的问题。)
限制: 因为光线传输的过程发生在离线,所以动态物体只能接受 GI 的照明而不能给周围的物体产生 GI 影响
…
工程上处理
TODO:
烘培灯光 与 PRTGI 的效果对照


虽然太阳光的方向不一致,但仍然能够看出来明显的差异。
引用 **闫令琪 教授的 话 **评估好的 GI 的方式就是看画面”亮不亮”,细节的明度对比程度。
预计算辐照度全局光照(Precomputed Radiance Transfer Global Illumination)
Nikolay.Stefanov.GDC.2016.pdf Global Illumination in Tom Clancy’s The Division
预计算辐照度全局光照(PRTGI)从理论到实战 AKG4e3 | 知乎
实时PRTGI技术与实现 网易雷火 | 知乎
体探针漏光解决方案 |知乎