---
title: Untitled
date: 2025-06-03 10:19:25
excerpt: 
tags: 
rating: ⭐
---
# 前言
1. ShaderWorldPCGInterop:
2. ShaderWorld:
3. ShaderWorldCore:

# ShaderWorld
- Class 
	- Actor
		- ShaderWorldActor.h:[[#AShaderWorldActor]]
		- SWorld.h:[[#ASWorld]]

## ASWorld
## AShaderWorldActor



## DrawMaterialToRenderTarget
USWorldSubsystem::DrawMaterialToRenderTarget
=>
SWShaderToolBox::DrawMaterial
=>
DrawMaterial_CS_RT

调用路径:
- AShaderWorldActor::RetrieveHeightAt(好像没有引用):检索高度
- AShaderWorldActor::ComputeHeight_Segmented_MapForClipMap
	- AShaderWorldActor::ProcessSegmentedComputation() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()
- AShaderWorldActor::ComputeHeightMapForClipMap
	- AShaderWorldActor::UpdateClipMap() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()
- AShaderWorldActor::ComputeDataLayersForClipMap
	- AShaderWorldActor::UpdateClipMap() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()
- AShaderWorldActor::UpdateCollisionMeshData:更新碰撞模型数据。
	- AShaderWorldActor::CollisionGPU() <- AShaderWorldActor::CollisionManagement() <- AShaderWorldActor::Tick()
- FSpawnableMesh::UpdateSpawnableData
	- AShaderWorldActor::ProcessSegmentedComputation() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()


## Cache机制
AShaderWorldActor::ProcessSegmentedComputation() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()


# 其他Bug


## SetTextureParameterValue相关逻辑排查
- AShaderWorldActor中的SetTextureParameterValue
	- ~~ExportCacheInBounds~~
	- ~~AssignHeightMapToDynamicMaterial~~
	- UpdateStaticDataFor
	- ComputeHeight_Segmented_MapForClipMap:似乎会设置
	- ~~UpdateCollisionMeshData~~
	- [x] [[#InitializeReadBackDependencies]]
	- [x] InitiateMaterials

### UpdateStaticDataFor


### ComputeHeight_Segmented_MapForClipMap
- 作用:
- 调用顺序:AShaderWorldActor::Tick() -> AShaderWorldActor::TerrainAndSpawnablesManagement() -> AShaderWorldActor::ProcessSegmentedComputation() -> ComputeHeight_Segmented_MapForClipMap


>// 1) Intersect clipmap with grid quad  
  // 2) Gather non computed quads   
  // 3) Allocated Compute element to missing Quad   
  // 4) Update the indirection data to the new elements  
  // 5) Update the Clipmap Heightmap with the grid data
 

### UpdateCollisionMeshData
 - 作用:
	 1. 判断DynCollisionMat是否有效,无效就使用`Generator`(高度数据生成材质)来创建。
	 2. 设置材质参数NoMargin、TexelPerSide、PatchFullSize、MeshScale。
	 3. 设置随机种子相关的材质参数。
	 4. 设置材质参数PatchLocation。
	 5. 生成碰撞数据到`CollisionRT`。
	 6. 笔刷功能逻辑:ApplyBrushStackToHeightMap()。
	 7. ExportPhysicalMaterialID逻辑。
	 8. GPU碰撞数据回读:ShaderWorld::AsyncReadPixelsFromRT()。
		 1. ShaderWorld::GSWReadbackManager.AddPendingReadBack(),将回读Task增加`TArray<FReadBackTask> PendingReads;`。
		 2. 之后会在USWorldSubsystem::Tick()中调用ShaderWorld::GSWReadbackManager.TickReadBack(),不断检查是否可回读,并进行最终回读。
 - 调用顺序:Tick() -> CollisionManagement() -> CollisionGPU() -> UpdateCollisionMeshData()

```c++
namespace ShaderWorld
{
	FORCEINLINE void AsyncReadPixelsFromRT(UShaderWorldRT2D* InRT, TSharedPtr<FSWColorRead, ESPMode::ThreadSafe> Destination, TSharedPtr < FThreadSafeBool, ESPMode::ThreadSafe> Completion)
	{

		ENQUEUE_RENDER_COMMAND(ReadGeoClipMapRTCmd)(
			[InRT, HeightData = Destination, Completion = Completion](FRHICommandListImmediate& RHICmdList)
			{
				check(IsInRenderingThread());

				if (HeightData.IsValid() && InRT->GetResource())
				{
					FRDGBuilder GraphBuilder(RHICmdList);
					TSharedPtr<FRHIGPUTextureReadback> ReadBackStaging = MakeShared<FRHIGPUTextureReadback>(TEXT("SWGPUTextureReadback"));
					FRDGTextureRef RDGSourceTexture = RegisterExternalTexture(GraphBuilder, InRT->GetResource()->TextureRHI, TEXT("SWSourceTextureToReadbackTexture"));
					AddEnqueueCopyPass(GraphBuilder, ReadBackStaging.Get(), RDGSourceTexture);
					GraphBuilder.Execute();

					ShaderWorld::GSWReadbackManager.AddPendingReadBack(RHICmdList, GPixelFormats[RDGSourceTexture->Desc.Format].BlockBytes, RDGSourceTexture->Desc.Extent.X, RDGSourceTexture->Desc.Extent.Y, ReadBackStaging, const_cast<TSharedPtr<FSWColorRead, ESPMode::ThreadSafe>&>(HeightData), const_cast<TSharedPtr < FThreadSafeBool, ESPMode::ThreadSafe>&>(Completion));
				}

			});	
	}
```


### InitializeReadBackDependencies
- 作用:初始化几个GPU数据回读用的RT。
- 调用顺序:BeginPlay() -> InitiateWorld() -> InitializeReadBackDependencies()

1. 初始化3个RT:ReadRequestLocation、ReadRequestLocationHeightmap、GeneratorDynamicForReadBack。
2. 会设置`TObjectPtr < UMaterialInstanceDynamic> GeneratorDynamicForReadBack`各种变量
```c++
GeneratorDynamicForReadBack->SetScalarParameterValue("HeightReadBack", 1.f);  
GeneratorDynamicForReadBack->SetTextureParameterValue("SpecificLocationsRT", ReadRequestLocation);  
GeneratorDynamicForReadBack->SetScalarParameterValue("NoMargin", 0.f);  
GeneratorDynamicForReadBack->SetScalarParameterValue("N", N);  
GeneratorDynamicForReadBack->SetScalarParameterValue("NormalMapSelect", 0.f);  
GeneratorDynamicForReadBack->SetScalarParameterValue("HeightMapToggle", 1.f);
```
3. 设置随机种子相关Shader Parameter。
### InitiateMaterials
作用:初始化`TArray<FClipMapMeshElement> Meshes;`的Material、`Producers`
调用顺序:BeginPlay() -> InitiateWorld() -> InitiateMaterials()

经过断点调试,会设置WorldSettings里的Material(地形Material)的HeightMap与NormalMap。


# 
SWorldSubsystem->DrawMaterialToRenderTarget


# Rebuild逻辑
## 重要函数
- AShaderWorldActor::BeginPlay()
- AShaderWorldActor::Setup()(<- TerrainAndSpawnablesManagement(float& DeltaT) <- Tick())