77 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Untitled
date: 2024-08-15 12:02:42
excerpt:
tags:
rating: ⭐
---
# 前言
- [UE5渲染--GPUScene与合并绘制](https://zhuanlan.zhihu.com/p/614758211)
# 相关类型
- 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
```c++
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数据更新
```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、同理InstanceBVHUploaderLightmapUploader。
2.2.4、最后都会调用每个Uploader的***End()方法进行GPU显存的更新***。
总结数据的上传都一样将需要更新的数据Copy到对应的UploadBuffer对应的位置里然后通过对应的ComputeShader进行更新到目标Buffer在函数FRDGAsyncScatterUploadBuffer::End()里实现,截图:
![](https://pic2.zhimg.com/80/v2-9f1c352cf6fd2900e60280c80e0e3cf1_720w.webp)