02 - 世界空间的实时全局光照算法
本文将介绍一些世界空间上的实时全局光照算法,例如LPV(Light Propagation Volumes),VXGI(Voxel Global Illumination)。
世界空间算法
如果全局光照算法在生成间接光照效果时,除了用到从相机视角和光源视角得到的图像空间信息之外,还用到了从其它的场景三维信息,即该算法使用了世界空间(world space)的信息,则这该算法属于世界空间算法。
LPV
LPV(Light Propagation Volumes) 算法的核心是把场景细分为三维网格,在格网单元之间传播来自次级光源的辐射亮度,拟合辐射亮度场(radiance field)。
历史
最早在 CryEngine3 中被引入,它速度快效果好。
思路
全局光照的核心问题就是 如何从各着色点得到来自任意方向次级光源对该点的贡献。
LPV算法注意到 Radiance
在直线传播的过程中是不变的。于是它将3D场景用网格拆分开(如上图),每个单元格叫 体素(Voxel),然后让这些体素管理次级光源Radiance
的直线传播。
步骤
生成次级光源:类似于RSM的第一步,也是用SM找到被直接光照亮的表面作为次级光源。为了加速计算,可以从这些次级光源中进行采样,舍弃掉不符要求的次级光源。
注入
Radiance
:预先把场景用体素划分(可映射至3D纹理中);然后对每个体素单元,如果有次级光源的话,就对它所有方向的Radiance
求和,然后投影到2阶球谐函数SH上。传播
Radiance
:对于每个体素单元格,先收集从6个面来的Radiance
(传播过程中不考虑可见性),然后求和并投影在SH上,再将Radiance
扩散到6个方向的相邻体素单元格上。传播过程一般要迭代4~5次才稳定。渲染:找到着色点所在的体素单元格,根据该单元格的
Radiance
信息(各方向的)进行着色。
优缺点
优点:稳定,对动态物体处理效果好。
缺点:
如果体素单元格划分过大,可能会在相同体素单元格中发生遮挡现象(而传播
Radiance
时不考虑可见性):这样会导致背面”透光“,即发生Light Leaking现象。如下图,本被遮挡的地方居然发光了:
如果体素单元格划分过小,就会导致时间复杂度增加。这又是一种取舍。
解决方法可以是:使用自适应格子划分;用多种分辨率进行划分(工业界的层级划分)。
VXGI
VXGI(Voxel Global Illumination) 算法生成的全局光照效果接近于光线追踪(ray tracing),比 RSM 算法和 LPV 算法更佳,但是速度也更慢一些。
简介
VXGI是一个两趟(2-Pass)的算法。它和RSM的区别如下:
- RSM里的次级光源是一片纹素;VXGI里的次级光源是一系列体素单元格,且这些格子有树形层级结构。
- RSM里着色需要进行采样;VXGI里着色需要进行
Cone Tracing
,即检查着色点周围的体素单元格,综合计算贡献。
步骤
把场景体素化,并构造树形层次结构(一般是八叉树):
Light Pass:统计并存储每个体素单元中次级光照的入射
radiance
分布和表面法线分布;然后根据层级树状关系更新父子节点存储的信息。Camera Pass:从相机出发找到着色点,根据着色点材质进行基于体素的锥体追踪(Cone Tracing),根据体素单元格的树形层级关系由模糊到精准地累积获取着色点的次级光源
Radiance
分布信息和表面法线分布信息。如果着色点表面是
glossy
的,那么仅需在镜面反射方向追踪一个锥体即可;如果着色点表面是diffuse
的,可以追踪一个超大号锥体,也可以追踪覆盖半球的多个小锥体(如8个),最后综合计算贡献。
优缺点
优点:效果很好,接近光线追踪。
缺点:算法开销相对更大。
参考资料
- GAMES202: 高质量实时渲染 (ucsb.edu)
- 《GAMES202:高质量实时渲染》3 实时全局光照:RSM、LPV、VXGI、SSAO、SSDO、SSR - 知乎 (zhihu.com)