Lumen离线预处理
MeshCard生成
目前从代码来看,MeshCard生成,必须要在Editor上才可以,运行时不行。后面如果运行时加载vrscene,这个会是难点。
具体代码如下:
Engine/Source/Runtime/Engine/Private/MeshCardRepresentation.cpp
void FAsyncCardRepresentationTaskWorker::DoWork()
{
// Put on background thread to avoid interfering with game-thread bound tasks
FQueuedThreadPoolTaskGraphWrapper TaskGraphWrapper(ENamedThreads::AnyBackgroundThreadNormalTask);
GCardRepresentationAsyncQueue->Build(&Task, TaskGraphWrapper);
}
void FCardRepresentationAsyncQueue::Build(FAsyncCardRepresentationTask* Task, FQueuedThreadPool& BuildThreadPool)
{
#if WITH_EDITOR
// Editor 'force delete' can null any UObject pointers which are seen by reference collecting (eg UProperty or serialized)
if (Task->StaticMesh && Task->GenerateSource)
{
TRACE_CPUPROFILER_EVENT_SCOPE(FCardRepresentationAsyncQueue::Build);
const FStaticMeshLODResources& LODModel = Task->GenerateSource->GetRenderData()->LODResources[0];
Task->bSuccess = MeshUtilities->GenerateCardRepresentationData(
Task->StaticMesh->GetName(),
Task->SourceMeshData,
LODModel,
BuildThreadPool,
Task->MaterialBlendModes,
Task->GenerateSource->GetRenderData()->Bounds,
Task->GenerateSource->GetRenderData()->LODResources[0].DistanceFieldData,
Task->MaxLumenMeshCards,
Task->bGenerateDistanceFieldAsIfTwoSided,
*Task->GeneratedCardRepresentation);
}
#endif
}
Engine/Source/Developer/MeshUtilities/Private/MeshCardRepresentationUtilities.cpp
主要函数:
- FMeshUtilities::GenerateCardRepresentationData
- MeshRepresentation::SetupEmbreeScene
- BuildMeshCards
MeshDistanceField生成
在导入模型时,异步生成。
Lumen运行时流程
GlobalDistanceField生成
Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp
Render:PrepareDistanceFieldScene,在RenderPrePass之前。
- 具体执行:Engine/Source/Runtime/Renderer/Private/GlobalDistanceField.cpp
- UpdateGlobalDistanceFieldVolume()
LumenScene Init
Render: BeginUpdateLumenSceneTasks -> UpdateSurfaceCachePrimitives(AddMeshCards-> AddMeshCardsFromBuildData) -> UpdateSurfaceCacheMeshCards -> ProcessLumenSurfaceCacheRequests -> AddCardCaptureDraws
具体代码:
LumenScene Update
材质相关,生成SurfaceCache。
BuildRenderingCommands → ClearCardCapture → MeshCardCapture → CopyCardsToSurfaceCache.
具体代码:
LumenScene Lighting
BuildCardUpdateContext -> RenderDirectLightingForLumenScene -> RenderRadiosityForLumenScene
具体代码:
- Lumen:Radiosity-CSDN博客
- Lumen DirectLighting:CullTiles-CSDN博客
- Lumen Directlighting: CombineLighting-CSDN博客
文章参考:
LumenScene ProbeGather
UniformPlacement Probe -> AdaptivePlacement Probe -> GenerateBRDF_PDF -> UpdateRadianceCache → ComputeLightingPDF(重要性采样) → TraceScreenProbes → FilterScreenProbes → InterpolateAndIntegrate
具体代码:
文章参考:
Reference