--- 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 PendingReads;`。 2. 之后会在USWorldSubsystem::Tick()中调用ShaderWorld::GSWReadbackManager.TickReadBack(),不断检查是否可回读,并进行最终回读。 - 调用顺序:Tick() -> CollisionManagement() -> CollisionGPU() -> UpdateCollisionMeshData() ```c++ namespace ShaderWorld { FORCEINLINE void AsyncReadPixelsFromRT(UShaderWorldRT2D* InRT, TSharedPtr 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 ReadBackStaging = MakeShared(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&>(HeightData), const_cast&>(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 Meshes;`的Material、`Producers` 调用顺序:BeginPlay() -> InitiateWorld() -> InitiateMaterials() 经过断点调试,会设置WorldSettings里的Material(地形Material)的HeightMap与NormalMap。