Lumen:代码层面全流程

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

具体代码:

文章参考:

LumenScene ProbeGather

UniformPlacement Probe -> AdaptivePlacement Probe -> GenerateBRDF_PDF -> UpdateRadianceCache → ComputeLightingPDF(重要性采样) → TraceScreenProbes → FilterScreenProbes → InterpolateAndIntegrate

具体代码:

文章参考:

Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值