Lightmass分析(五) 光照评估

Intro

Lightmass分析 系列文章前言及目录

在之前的文章中, 我们已经计算出了 IrradiancePhotonsMap 中有效光子的 Irradiance. 接下来我们便需要利用这些光子来评估场景中各个物体表面的全局光照.

这部分的主要工作是: 使用 Ray Tracing, Final Gather 等方法对物体表面进行光照评估

直接光照

Lightmass 的直接光照和阴影默认是使用 RayTracing 的方式求解的. 与光线最终略有区别的是 Lightmass 直接遍历物体表面上的每一个点, 不需要使用摄像机发射 View Ray 与场景做相交测试(烘焙阶段本身也没有所谓的摄像机)
Lightmass分析(五) 光照评估_第1张图片在计算阴影的时候, 为了产生半影效果, 我们会为一个顶点采样多条 Shadow Ray, 这些 Shadow Ray 由场景中光源的表面样本(LightSurfaceSample)产生. 如果这些 Shadow Ray 全都被场景阻挡则说明当前顶点完全处于阴影范围内. 如果这些 Shadow Ray 全都不被场景阻挡则说明当前顶点完全处于阴影范围外. 如果一部分被阻挡一部分没有被阻挡则说明当前顶点处于半影范围内.

当判断出当前顶点处于半影范围内时, Lightmass 会对这个顶点再进行一次针对半影 Shadow Ray 测试, 求解出更精确的半影系数. 基于只有非常少的顶点会落入狭小的半影区域内的事实, 所以这部分额外的计算消耗是可以接受的.

Lightmass分析(五) 光照评估_第2张图片

Final Gather (FG)

基础的光子照度评估方式在光子数量不充分的情况下会存在大量的低频噪声, 渲染出来的图像质量不太高. FG抛弃了直接使用评估点附近K邻近估计的方式进行照度估算, 转而在每个FG采样点的上半球区域向所有方向上发射大量FG采样射线, 利用这些射线和场景求交并获取交点处的照度并叠加到FG的照度中并做均值处理, 从而估算出该FG点的照度值.
Lightmass分析(五) 光照评估_第3张图片

间接光照

Lightmass 使用 Final Gather 方法进行间接光照的求解. 但是单纯的 FG 计算量过大, 考虑到我们的场景表面光照一般都是连续且缓慢变化的, 所以我们可以计算出适量的 FG Sample Cache, 然后在利用这些样本缓存通过插值的方式计算最终的间接光照(CachePointIncomingRadiance).

Lightmass 的 FG 使用自适应采样去评估 incident radiance (IncomingRadianceAdaptive). Lightmass 首先将半球空间划分为均匀的格子, 然后根据事先生成的半球空间采样射线为每一个 Grid 计算 Radiance. 我们之前缓存的 SurfaceCacheLighting 在这里起作用(CalculateExitantRadiance), 可以直接提供目标位置的光照信息. 然后所有的样本经过 Filter(滤波) 之后就完成了对当前 FG Sample 的光照评估. 最后 Lightmass 根据之前生成的 FG Sample Cache, 经过插值生成完整的 Lightmap.

所谓"自适应"体现在当发现相邻Grid的光照信息发生剧烈变化的时候, Lightmass 会将这个 Grid 拆分成 4 个 Sub Grid 进行进一步的光照评估. 如此往复直至触发中止条件.
Lightmass分析(五) 光照评估_第4张图片Lightmass分析(五) 光照评估_第5张图片
另外 FG 本身也需要发射很多条射线才能达到比较好的效果(一般大于128条), 这对计算能力又是一个比较大的挑战. Lightmass 使用 Irradiance Gradient 技术在较少的样本下达到更好的效果. Irradiance Gradient 在此不再展开, 感兴趣的话可以阅读论文 《Irradiance Gradients》 Gregory J. Ward, Paul S. Heckbert

Lightmass分析(五) 光照评估_第6张图片

参考文献

Jiff:Lightmass分析之 经典Photon Mapping算法介绍
Jiff:LightMass源码分析之光子追踪实现
Jiff:LightMass源码分析之光照评估

你可能感兴趣的:(Unreal,Lightmass)