lumen在渲染的时候会走几个步骤:
第一是BeginUpdateLumenSceneTasks对场景的距离场体素重建
第二是UpdateLumenScene更新lumen的场景以及包括用nanite提出并且上传lumen的card
第三是RenderLumenSceneLighting获取lumen光照的直接光与间接光
第四是RenderLumenSceneVisualization可视化探针的获取与设置,体素步进与辐射度设置。
第五是RenderDiffuseIndirectAndAmbientOcclusion中对lumen的探针执行计算获取探针的光照来叠加。
首先判断IsLumenFeatureAllowedForView,对view是否支持lumen做一个判断。
然后先执行RenderScreenProbeGatherVisualizeTraces,也就是执行可视化的屏幕探测器的收集,他主要执行FVisualizeTraces里面的两个shader,FVisualizeTracesVS和FVisualizeTracesPS。
FVisualizeTracesVS执行LumenScreenProbeTracing.usf的VisualizeTracesVS。他会让世界坐标是2的倍数,通过”&1“来操作。并且顶点中输出TraceLighting。
然后在VisualizeTracesPS中通过光栅化直接输出颜色。
通过GraphicsPSOInit这个FGraphicsPipelineStateInitializer执行到pipline里面。
如果有可视化场景bVisualizeScene。
这里也会有两个版本,一个是光线追踪的,一个是有号距离场的版本。
光线追踪直接执行VisualizeHardwareRayTracing。
如果是距离场的话则首先剔除CullMeshSDFObjectsToViewGrid,然后ComputeShader的FVisualizeLumenSceneCS执行VisualizeLumenScene.usf的VisualizeQuadsCS执行颜色计算
这里会先拿到步进的开始路径,如果开启了辐射度缓存还会从辐射度拿遮挡的距离。最终把信息放到FConeTraceInput里面,包括体素步进开始距离,meshcard数量等。
然后有三个版本的步进方式。
ConeTraceLumenCards这里会对所有的LumenCardScene.NumCards执行ConeTraceSingleLumenCard会在局部空间中执行LumenCardScene.MaxConeSteps内的步进,采样周围四个点的位置的深度,然后得到高度信息,高度信息在范围内则获取相交的采样位置IntersectionSamplePositionXY
找到表面后光照信息,遮挡,相交时间到ConeStepBlendState.AddLighting。然后把信息写入CardTraceBlendState.AddCardTrace。
ConeTraceVoxels是全局距离场的步进模式,这里还会把透明度信息计算上。
ConeTraceLumenScene则会执行两步“ConeTraceLumenSceneCards”“ConeTraceLumenSceneVoxels”
ConeTraceLumenSceneCards执行ConeTraceMeshSDFsAndInterpolateFromCards然后用MeshSDF的方式步进判断碰撞的对象,
然后用SampleLumenMeshCards得到光照信息。SampleLumenMeshCards是用SampleLumenMeshCardsWithWeight中拿到xyz三个轴的权重并且对三个轴进行进行采样SampleLumenCard。另外如果有距离场光照还会执行一次距离场的SampleLumenCard,最终整合颜色到Lighting中。
然后用ConeTraceLumenSceneVoxels里面执行ConeTraceVoxels用globaSDF步进获取光照颜色。
这里的辐射度颜色是通过probe的9个球谐得出的SampleRadianceCacheProbeWithParallaxCorrection。
SampleRadianceCacheProbeWithParallaxCorrection里面又是步进100次获取的ReprojectedDirection。通过SampleRadianceCacheProbe获取到probe的辐射度值。
或者是距离场方式获取颜色
里面也是通过ConeTraceSingleLumenCard在局部空间中执行LumenCardScene.MaxConeSteps内的步进,采样周围四个点的位置的深度,然后得到高度信息,高度信息在范围内则获取相交的采样位置IntersectionSamplePositionXY。找到表面后光照信息,遮挡,相交时间到ConeStepBlendState.AddLighting。然后把信息写入CardTraceBlendState.AddCardTrace。
这个是跟上面走的路径不一样的分支。这里主要是需要输出步进的信息的。
如果是可视化的体素bVisualizeVoxels则执行ComputeShader的VisualizeLumenScene.usf中的VisualizeLumenVoxelsCS。步进去获取体素中的颜色信息。
获取颜色后执行FVisualizeLumenSceneStatsCS执行VisualizeLumenScene.usf的VisualizeStatsCS。这里主要是输出一些打印信息。
然后执行FDeferredShadingSceneRenderer::RenderLumenRadianceCacheVisualization对RadianceCacheState.Clipmaps的所有clipmap执行FVisualizeRadianceCacheParameters这个shader,具体shader分别是LumenVisualizeRadianceCache.usf的VisualizeRadianceCacheVS和VisualizeRadianceCachePS。分别是获取辐射度的位置。
以及在VisualizeRadianceCachePS中通过probe获取间接光颜色,遮蔽,辐射度缓存得到光照信息。
最后输出到FDeferredShadingSceneRenderer::Render的SceneTextures中继续下一个渲染流程。