3.0 KiB
Raw Permalink Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
Untitled 2024-08-15 12:02:42

前言

相关类型

  • Primitive
    • C++的数据类型_FPrimitiveUniformShaderParameters_PrimitiveUniformShaderParameters.h)
    • Shader的数据FPrimitiveSceneDataSceneData.ush)
  • Instance
    • C++的数据类型FInstanceSceneShaderDataInstanceUniformShaderParameters.h)
    • Shader的数据FInstanceSceneDataSceneData.ush)
  • Payload
    • C++数据类型FPackedBatch、FPackedItemInstanceCullingLoadBalancer.h)
    • Shader的数据类型FPackedInstanceBatch、FPackedInstanceBatchItemInstanceCullingLoadBalancer.ush)

DeferredShadingRenderer.cpp

Scene->GPUScene.Update(GraphBuilder, GetSceneUniforms(), *Scene, ExternalAccessQueue);  
  
for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++)  
{  
    FViewInfo& View = Views[ViewIndex];  
    RDG_GPU_MASK_SCOPE(GraphBuilder, View.GPUMask);  
    
    Scene->GPUScene.UploadDynamicPrimitiveShaderDataForView(GraphBuilder, *Scene, View, ExternalAccessQueue);  
    
    Scene->GPUScene.DebugRender(GraphBuilder, *Scene, GetSceneUniforms(), View);  
}

GPUScene数据更新

// 函数调用关系
void FDeferredShadingSceneRenderer::Render(FRDGBuilder& GraphBuilder)
{
	void FGPUScene::Update(FRDGBuilder& GraphBuilder, FScene& Scene, FRDGExternalAccessQueue& ExternalAccessQueue)
	{		
		void FGPUScene::UpdateInternal(FRDGBuilder& GraphBuilder, FScene& Scene, FRDGExternalAccessQueue& ExternalAccessQueue)
	}
}

2.2、更新PrimitiveData

接下来对标记为dirty的Primitive进行更新更新逻辑为找到该Primitive在PrimitiveData Buffer里对应offset位置对其进行更新。使用模板FUploadDataSourceAdapterScenePrimitives调用UploadGeneral()。

初始化5类Buffer的上传任务TaskContext

后面代码都是在对这个TaskContext进行初始化然后启动任务进行数据的上传。

2.2.1、并行更新Primitive数据将需要更新的PrimitiveCopy到Upload Buffer里后续通过ComputeShader进行显存的上传然后更新到目标Buffer里

2.2.2、同理InstanceSceneData以及InstancePayloadData数据的处理。

2.2.3、同理InstanceBVHUploaderLightmapUploader。

2.2.4、最后都会调用每个Uploader的End()方法进行GPU显存的更新

总结数据的上传都一样将需要更新的数据Copy到对应的UploadBuffer对应的位置里然后通过对应的ComputeShader进行更新到目标Buffer在函数FRDGAsyncScatterUploadBuffer::End()里实现,截图: