本篇对《Real-Time Rendering》一书中全局光照相关知识进行概括总结和扩展。主要内容包括:
- 全局光照概述
- 光线投射、光线追踪和路径追踪的区别
- 环境光遮蔽
1 全局光照
全局光照 (Global Illumination,GI),是指既考虑场景中直接来自光源的光照(Direct Light)又考虑经过场景中其他物体反射后的光照(Indirect Light)的一种渲染技术。使用全局光照能够有效地增强场景的真实感。
可以理解为:全局光照 = 直接光照(Direct Light) + 间接光照(Indirect Light)
虽说实际应用中只有漫反射全局照明的模拟算法被称为全局照明算法,但其实理论上说反射、折射、阴影都属于全局光照的范畴,因为模拟它们的时候不仅仅要考虑光源对物体的直接作用还要考虑物体与物体之间的相互作用。也是因为,镜面反射、折射、阴影一般不需要进行复杂的光照方程求解,也不需要进行迭代的计算。因此,这些部分的算法已经十分高效,甚至可以做到实时。不同于镜面反射,光的漫反射表面反弹时的方向是近似“随机”,因此不能用简单的光线跟踪得到反射的结果,往往需要利用多种方法进行多次迭代,直到光能分布达到一个基本平衡的状态。
经过几十年的发展,全局光照现今已有多种实现方向,常见的全局光照主要流派列举如下:
- Ray tracing 光线追踪
- Path tracing 路径追踪
- Photon mapping 光子映射
- Point Based Global Illumination 基于点的全局光照
- Radiosity 辐射度
- Metropolis light transport 梅特波利斯光照传输
- Spherical harmonic lighting 球谐光照
- Ambient occlusion 环境光遮蔽
- Voxel-based Global Illumination 基于体素的全局光照
- Light Propagation Volumes Global Illumination
- Deferred Radiance Transfer Global Illumination
- Deep G-Buffer based Global Illumination
而其中的每种流派,又可以划分为 N 种改进和衍生算法。
如光线追踪(Ray Tracing)派系,其实就是一个框架,符合条件的都可称为光线追踪,其又分为递归式光线追踪(Whitted-style Ray Tracing),分布式光线追踪(Distribution Ray Tracing),蒙特卡洛光线追踪(Monte Carlo Ray Tracing)等。
而路径追踪(Path tracing)派系,又分为蒙特卡洛路径追踪(Monte Carlo Path Tracing),双向路径追踪(Bidirectional Path Tracing),能量再分配路径追踪(Energy Redistribution Path Tracing)等。
其中有些派系又相互关联,如路径追踪,就是基于光线追踪,结合了蒙特卡洛方法而成的一种新的派系。
2 光线投射、光线追踪和路径追踪的区别
关于光线追踪和路径追踪可以查看之前的笔记:
- 【计算机图形学】(十一)Whitted 风格光线追踪
- 【计算机图形学】(十三)路径追踪
- RayTracer 系列前半部分实现的是光线追踪,后半部分加入蒙特卡洛后最终实现的是一个路径追踪器
这里总结一下光线追踪、光线投射和路径追踪的区别:
- 光线追踪 Ray Tracing:这其实是个框架,而不是个方法。符合这个框架的都叫 ray tracing。这个框架就是从视点发射 ray,与物体相交就根据规则反射、折射或吸收。遇到光源或者走太远就停住。一般来说运算量不小。
- 光线投射 Ray Casting:它就是 ray tracing 的第一步,发射光线,与物体相交。这个可以做的很快,也可以用来做遮挡、阴影等。
- 路径追踪 Path Tracing:路径追踪就是 ray tracing + 蒙特卡洛法。在相交后会选一个随机方向继续跟踪,并根据 BRDF 计算颜色。运算量也不小。还有一些小分类,比如 Bidirectional path tracing。
3 环境光遮蔽
环境光遮蔽(Ambient Occlusion,简称 AO)是全局光照明的一种近似替代品,可以产生重要的视觉明暗效果,通过描绘物体之间由于遮挡而产生的阴影, 能够更好地捕捉到场景中的细节,可以解决漏光,阴影漂浮等问题,改善场景中角落、锯齿、裂缝等细小物体阴影不清晰等问题,增强场景的深度和立体感。
可以说,环境光遮蔽在直观上给玩家的主要感觉体现在画面的明暗程度上,未开启环境光遮蔽特效的画面光照稍亮一些;而开启环境光遮蔽特效之后, 局部的细节画面尤其是暗部阴影会更加明显一些。
Ambient Occlusion 的细分种类有:
- SSAO-Screen space ambient occlusion
- SSDO-Screen space directional occlusion
- HDAO-High Definition Ambient Occlusion
- HBAO+-Horizon Based Ambient Occlusion+
- AAO-Alchemy Ambient Occlusion
- ABAO-Angle Based Ambient Occlusion
- PBAO
- VXAO-Voxel Accelerated Ambient Occlusion
一般而言,Ambient Occlusion 最常用方法是 SSAO,如 Unreal Engine 4 中的 AO,即是用 SSAO 实现。关于 SSAO 的原理可以查看这篇文章简要了解:环境遮罩之SSAO原理
总的来说 SSAO 是在屏幕空间进行的环境光遮蔽计算,以牺牲部分渲染效果和精度的代价,来换取高时效性,适用于游戏等实时渲染领域。