ue5-lumen的光照探针数据收集RenderLumenSceneVisualization

lumen在渲染的时候会走几个步骤:

第一是BeginUpdateLumenSceneTasks对场景的距离场体素重建

第二是UpdateLumenScene更新lumen的场景以及包括用nanite提出并且上传lumen的card

第三是RenderLumenSceneLighting获取lumen光照的直接光与间接光

第四是RenderLumenSceneVisualization可视化探针的获取与设置,体素步进与辐射度设置。

第五是RenderDiffuseIndirectAndAmbientOcclusion中对lumen的探针执行计算获取探针的光照来叠加。

首先判断IsLumenFeatureAllowedForView,对view是否支持lumen做一个判断。

可视化的屏幕探测器的收集

然后先执行RenderScreenProbeGatherVisualizeTraces,也就是执行可视化的屏幕探测器的收集,他主要执行FVisualizeTraces里面的两个shader,FVisualizeTracesVSFVisualizeTracesPS

FVisualizeTracesVS执行LumenScreenProbeTracing.usf的VisualizeTracesVS。他会让世界坐标是2的倍数,通过”&1“来操作。并且顶点中输出TraceLighting。

然后在VisualizeTracesPS中通过光栅化直接输出颜色。

通过GraphicsPSOInit这个FGraphicsPipelineStateInitializer执行到pipline里面。

两种模式获取颜色(可视化场景颜色以及体素化场景颜色):

可视化场景颜色获取:

如果有可视化场景bVisualizeScene。

这里也会有两个版本,一个是光线追踪的,一个是有号距离场的版本。

光线追踪直接执行VisualizeHardwareRayTracing。

如果是距离场的话则首先剔除CullMeshSDFObjectsToViewGrid,然后ComputeShader的FVisualizeLumenSceneCS执行VisualizeLumenScene.usf的VisualizeQuadsCS执行颜色计算

这里会先拿到步进的开始路径,如果开启了辐射度缓存还会从辐射度拿遮挡的距离。最终把信息放到FConeTraceInput里面,包括体素步进开始距离,meshcard数量等。

然后有三个版本的步进方式。

在LumenTracingCommon.ush中执行具体的步进。

ConeTraceLumenCards

ConeTraceLumenCards这里会对所有的LumenCardScene.NumCards执行ConeTraceSingleLumenCard会在局部空间中执行LumenCardScene.MaxConeSteps内的步进,采样周围四个点的位置的深度,然后得到高度信息,高度信息在范围内则获取相交的采样位置IntersectionSamplePositionXY

找到表面后光照信息,遮挡,相交时间到ConeStepBlendState.AddLighting。然后把信息写入CardTraceBlendState.AddCardTrace。

ConeTraceVoxels

ConeTraceVoxels是全局距离场的步进模式,这里还会把透明度信息计算上。

ConeTraceLumenScene

ConeTraceLumenScene则会执行两步“ConeTraceLumenSceneCards”“ConeTraceLumenSceneVoxels”

ConeTraceLumenSceneCards

ConeTraceLumenSceneCards执行ConeTraceMeshSDFsAndInterpolateFromCards然后用MeshSDF的方式步进判断碰撞的对象,

然后用SampleLumenMeshCards得到光照信息。SampleLumenMeshCards是用SampleLumenMeshCardsWithWeight中拿到xyz三个轴的权重并且对三个轴进行进行采样SampleLumenCard。另外如果有距离场光照还会执行一次距离场的SampleLumenCard,最终整合颜色到Lighting中。

ConeTraceLumenSceneVoxels

然后用ConeTraceLumenSceneVoxels里面执行ConeTraceVoxels用globaSDF步进获取光照颜色。

然后采样辐射度的信息。SampleRadianceCacheInterpolated

这里的辐射度颜色是通过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中继续下一个渲染流程。

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/123192528