77 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								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的数据FPrimitiveSceneData(SceneData.ush);
							 | 
						|||
| 
								 | 
							
								- Instance:
							 | 
						|||
| 
								 | 
							
									- C++的数据类型FInstanceSceneShaderData(InstanceUniformShaderParameters.h)
							 | 
						|||
| 
								 | 
							
									- Shader的数据FInstanceSceneData(SceneData.ush);
							 | 
						|||
| 
								 | 
							
								- Payload:
							 | 
						|||
| 
								 | 
							
									- C++数据类型FPackedBatch、FPackedItem(InstanceCullingLoadBalancer.h)
							 | 
						|||
| 
								 | 
							
									- Shader的数据类型FPackedInstanceBatch、FPackedInstanceBatchItem(InstanceCullingLoadBalancer.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
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								接下来,对标记为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、同理InstanceBVHUploader,LightmapUploader。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								2.2.4、最后都会调用每个Uploader的***End()方法进行GPU显存的更新***。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								总结:数据的上传都一样,将需要更新的数据Copy到对应的UploadBuffer对应的位置里,然后通过对应的ComputeShader进行更新到目标Buffer,在函数FRDGAsyncScatterUploadBuffer::End()里实现,截图:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 |