From beb8ab2c0c5fd3e7133bae923433bae76681816e Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Thu, 15 Aug 2024 17:28:55 +0800 Subject: [PATCH] vault backup: 2024-08-15 17:28:55 --- .../Rendering/RenderingPipeline/GPUScene.md | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/GPUScene.md b/03-UnrealEngine/Rendering/RenderingPipeline/GPUScene.md index c9eef69..45c94c9 100644 --- a/03-UnrealEngine/Rendering/RenderingPipeline/GPUScene.md +++ b/03-UnrealEngine/Rendering/RenderingPipeline/GPUScene.md @@ -32,4 +32,46 @@ for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) Scene->GPUScene.DebugRender(GraphBuilder, *Scene, GetSceneUniforms(), View); } -``` \ No newline at end of file +``` + +## GPUScene数据更新 +```c++ +// 函数调用关系 +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 + +![](https://pic4.zhimg.com/80/v2-8bbde169a322380c8510375091517133_720w.webp) + +接下来,对标记为dirty的Primitive进行更新,更新逻辑为找到该Primitive在PrimitiveData Buffer里对应offset位置,对其进行更新。使用模板FUploadDataSourceAdapterScenePrimitives调用UploadGeneral()。 + +![](https://pic2.zhimg.com/80/v2-8f1c866194961597d4c3a40f24442fb1_720w.webp) + +初始化5类Buffer的上传任务TaskContext + +后面代码都是在对这个TaskContext进行初始化,然后启动任务,进行数据的上传。 + +![](https://pic4.zhimg.com/80/v2-57bdcff035f205a83d3ca1a76036b9df_720w.webp) + +![](https://pic3.zhimg.com/80/v2-4a22a7aa675804c2598bbd5a60062922_720w.webp) + +2.2.1、并行更新Primitive数据,将需要更新的PrimitiveCopy到Upload Buffer里,后续通过ComputeShader进行显存的上传然后更新到目标Buffer里; + +![](https://pic3.zhimg.com/80/v2-e0260c108d7428401228dbf7be0408da_720w.webp) + +2.2.2、同理InstanceSceneData以及InstancePayloadData数据的处理。 + +2.2.3、同理InstanceBVHUploader,LightmapUploader。 + +2.2.4、最后都会调用每个Uploader的***End()方法进行GPU显存的更新***。 + +总结:数据的上传都一样,将需要更新的数据Copy到对应的UploadBuffer对应的位置里,然后通过对应的ComputeShader进行更新到目标Buffer,在函数FRDGAsyncScatterUploadBuffer::End()里实现,截图: + +![](https://pic2.zhimg.com/80/v2-9f1c352cf6fd2900e60280c80e0e3cf1_720w.webp) \ No newline at end of file