1.Lumen渲染流程框架
2.Lumen基本概念
2.1 LumenCard & LumenMeshCards
LumenMeshCards:一组带有方向性的模型简化代理,视模型复杂度不同可能包含6个及以上数量的LumenCard;用来提供光照采样的位置和方向。
2.2 LumenCardPage & LumenCardTile
CardPage:128x128像素,LumenCard排布在上面。
LumenCardTile:8x8像素,用于Tile-Based lighting。
2.3 MeshCardCapture & SurfaceCache
MeshCardCapture :将LumenCard信息转换为SurfaceCache需要内容。
SurfaceCache:四个通道贴图
- Lumen.CardCaptureAlbedoAtlas:存储 RGB:Albedo,Alpha:Opcity,格式:R8G8B8A8
- Lumen.CardCaptureNormalAtlas:存储 RG:World Normal XY,格式:R8G8
- Lumen.CardCaptureEmissiveAtlas:存储 Emissive,格式:R11G11B10
- Lumen.CardCaptureDepthStencilAtlas:存储 Depth,系统当前 DepthStencil 格式。
2.4 LumenSceneFinalLighting
- LumenSceneDirectLighting(第一次反弹灯光)
- LumenSceneIndirectLighting(LumenRadiosity)
LumenSceneFinalLighting = (DirectLighting + IndirectLighting) * Diffuse_Lambert(Albedo) + Emissive;
2.4.1 LumenSceneDirectLighting(第一次反弹灯光)
Irradiance = LightColor * AreaLightFalloffColor * (CombinedAttenuation * NoL * ShadowFactor);
2.4.2 LumenSceneIndirectLighting(LumenRadiosity)
实际上严格来说 Lumen 并不是 Ray Tracing,而是 Ray Casting,因为光线在与 SDF 相交后并没有再次 Bounce,因此最多只能产生一次 Bounce 的 Indirect Lighting,为了弥补这一点,Lumen 使用 Radiosity 来生成 Indirect Lighting。
传统的 Radiosity 方法需要将场景划分为 Patch,而 Lumen 已经拥有了粗粒度的 Global DF 以及粗粒度的 Voxel Lighting,因此可以直接从 Surface Cache 上射出光线,与 Global DF 进行 Ray Tracing 求交,
交点采样上一帧的 Voxel Lighting 后转换为二阶球谐,最后再根据 Normal 计算 Diffuse Transfer 球谐系数,计算出最终的 Indirect Radiance。
这个 Indirect Radiance 也保存在 Radiance Cache 中,称为 Indirect Lighting,并与 Direct Lighting 合并计算得到最终的 Final Lighting,而下一祯的 Voxel Lighting 又来自于这一祯的 Radiance Cache,因此后续所有的 Lumen 光照流程自然具有了间接光照。
具体代码:Lumen:Radiosity-CSDN博客
原理解释:游戏引擎随笔 0x32:UE5 Lumen 源码解析(四)Radiosity 篇 - 知乎
2.5 MeshSDF & GlobalSDF
2.6 LumenScene
与 FScene 做个类比,SDF 相当于 Mesh,Surface Cache 相当于 Material,两者共同构成了低精度粗粒度的场景表达,这就是 Lumen Scene。
因此 Lumen Scene 包含了 DF 描述的场景几何表达以及 Surface Cache 描述的场景材质表达,是一个完整的系统。
Lumen Scene 管理着整个场景的 Mesh DF 更新、Global DF 合并以及 Surface Cache 的更新。
3.Lumen GI渲染(ProbeGather)
先摆放Probe,然后计算RadianceCache,通过TraceScreen(SSGI),TraceMeshSDF,TraceGlobalSDF三种全局光照技术,实现最终GI。
3.1 PlaceProbe
UniformPlacement:每16x16像素摆放一个Probe
AdaptivePlacement:UniformSize/2 循环摆放,默认停止条件是4。(8x8摆放一次,4x4摆放一次)
可视化效果如下:
- 绿色圆圈内的Probe就是Adaptive产生
3.2 RadianceCache
具体代码:LumenSceneProbeGather:RadianceCache-CSDN博客
3.3 Tracing
3.3.1 TraceScreen 技术原理
具体代码:LumenScreenProbeGather:TraceScreen-CSDN博客
3.3.2 TraceMeshSDF技术原理
具体代码:LumenScreenProbeGather:TraceMeshSDF-CSDN博客
3.3.3 TraceGlobalSDF技术原理
具体代码:LumenScreenProbeGather:TraceVoxels-CSDN博客