77 lines
3.0 KiB
Markdown
Raw Normal View History

2024-08-15 12:39:00 +08:00
---
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);
}
2024-08-15 17:28:55 +08:00
```
## 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)