5.4 KiB
5.4 KiB
title, date, excerpt, tags, rating
title | date | excerpt | tags | rating |
---|---|---|---|---|
Untitled | 2025-06-03 10:19:25 | ⭐ |
前言
- ShaderWorldPCGInterop:
- ShaderWorld:
- ShaderWorldCore:
ShaderWorld
- Class
- Actor
- ShaderWorldActor.h:#AShaderWorldActor
- SWorld.h:#ASWorld
- Actor
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
ExportCacheInBoundsAssignHeightMapToDynamicMaterial- UpdateStaticDataFor
- ComputeHeight_Segmented_MapForClipMap:似乎会设置
UpdateCollisionMeshData- #InitializeReadBackDependencies
- InitiateMaterials
UpdateStaticDataFor
ComputeHeight_Segmented_MapForClipMap
AShaderWorldActor::Tick() -> AShaderWorldActor::TerrainAndSpawnablesManagement() -> AShaderWorldActor::ProcessSegmentedComputation() -> ComputeHeight_Segmented_MapForClipMap
UpdateCollisionMeshData
- 作用:
- 判断DynCollisionMat是否有效,无效就使用
Generator
(高度数据生成材质)来创建。 - 设置材质参数NoMargin、TexelPerSide、PatchFullSize、MeshScale。
- 设置随机种子相关的材质参数。
- 设置材质参数PatchLocation。
- 生成碰撞数据到
CollisionRT
。 - 笔刷功能逻辑:ApplyBrushStackToHeightMap()。
- ExportPhysicalMaterialID逻辑。
- GPU碰撞数据回读:ShaderWorld::AsyncReadPixelsFromRT()。
- ShaderWorld::GSWReadbackManager.AddPendingReadBack(),将回读Task增加
TArray<FReadBackTask> PendingReads;
。 - 之后会在USWorldSubsystem::Tick()中调用ShaderWorld::GSWReadbackManager.TickReadBack(),不断检查是否可回读,并进行最终回读。
- ShaderWorld::GSWReadbackManager.AddPendingReadBack(),将回读Task增加
- 判断DynCollisionMat是否有效,无效就使用
- 调用顺序: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()
- 初始化3个RT:ReadRequestLocation、ReadRequestLocationHeightmap、GeneratorDynamicForReadBack。
- 会设置
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);
- 设置随机种子相关Shader Parameter。
InitiateMaterials
作用:初始化TArray<FClipMapMeshElement> Meshes;
的Material、Producers
调用顺序:BeginPlay() -> InitiateWorld() -> InitiateMaterials()
经过断点调试,会设置WorldSettings里的Material(地形Material)的HeightMap与NormalMap。