6.2 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
Untitled 2025-06-03 10:19:25

前言

  1. ShaderWorldPCGInterop
  2. ShaderWorld
  3. ShaderWorldCore

ShaderWorld

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
    • #InitializeReadBackDependencies
    • 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()
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个RTReadRequestLocation、ReadRequestLocationHeightmap、GeneratorDynamicForReadBack。
  2. 会设置TObjectPtr < UMaterialInstanceDynamic> GeneratorDynamicForReadBack各种变量
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);
  1. 设置随机种子相关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()

Rebuild逻辑顺序

  1. AShaderWorldActor::BeginPlay() 1.

Debug

  1. AShaderWorldActor::ComputeHeight_Segmented_MapForClipMap 十多次
  2. UpdateCollisionMeshData
  3. AShaderWorldActor::ComputeHeight_Segmented_MapForClipMap 十多次
  4. RetrieveHeightAt
  5. UpdateCollisionMeshData 3次
  6. AShaderWorldActor::ComputeHeight_Segmented_MapForClipMap 十多次