2025-06-03 10:19:29 +08:00
|
|
|
|
---
|
|
|
|
|
title: Untitled
|
|
|
|
|
date: 2025-06-03 10:19:25
|
|
|
|
|
excerpt:
|
|
|
|
|
tags:
|
|
|
|
|
rating: ⭐
|
|
|
|
|
---
|
2025-06-03 10:50:23 +08:00
|
|
|
|
# 前言
|
|
|
|
|
1. ShaderWorldPCGInterop:
|
|
|
|
|
2. ShaderWorld:
|
2025-06-03 18:24:36 +08:00
|
|
|
|
3. ShaderWorldCore:
|
|
|
|
|
|
|
|
|
|
# ShaderWorld
|
|
|
|
|
- Class
|
|
|
|
|
- Actor
|
|
|
|
|
- ShaderWorldActor.h:[[#AShaderWorldActor]]
|
|
|
|
|
- SWorld.h:[[#ASWorld]]
|
|
|
|
|
|
|
|
|
|
## ASWorld
|
|
|
|
|
## AShaderWorldActor
|
|
|
|
|
|
2025-06-09 15:53:12 +08:00
|
|
|
|
|
2025-06-09 16:42:14 +08:00
|
|
|
|
|
|
|
|
|
## 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
|
2025-06-09 17:32:09 +08:00
|
|
|
|
- AShaderWorldActor::ProcessSegmentedComputation() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Cache机制
|
|
|
|
|
AShaderWorldActor::ProcessSegmentedComputation() <- AShaderWorldActor::TerrainAndSpawnablesManagement() <- AShaderWorldActor::Tick()
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 其他Bug
|
2025-06-10 18:47:39 +08:00
|
|
|
|
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
|
|
|
|
## SetTextureParameterValue相关逻辑排查
|
|
|
|
|
- AShaderWorldActor中的SetTextureParameterValue
|
|
|
|
|
- ~~ExportCacheInBounds~~
|
|
|
|
|
- ~~AssignHeightMapToDynamicMaterial~~
|
|
|
|
|
- UpdateStaticDataFor
|
|
|
|
|
- ComputeHeight_Segmented_MapForClipMap:似乎会设置
|
2025-06-10 18:47:39 +08:00
|
|
|
|
- ~~UpdateCollisionMeshData~~
|
2025-06-10 17:02:58 +08:00
|
|
|
|
- [x] [[#InitializeReadBackDependencies]]
|
|
|
|
|
- [x] InitiateMaterials
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
2025-06-10 18:47:39 +08:00
|
|
|
|
### UpdateStaticDataFor
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
2025-06-10 17:02:58 +08:00
|
|
|
|
|
2025-06-10 14:59:07 +08:00
|
|
|
|
### ComputeHeight_Segmented_MapForClipMap
|
2025-06-10 20:14:47 +08:00
|
|
|
|
- 作用:
|
|
|
|
|
- 调用顺序:AShaderWorldActor::Tick() -> AShaderWorldActor::TerrainAndSpawnablesManagement() -> AShaderWorldActor::ProcessSegmentedComputation() -> ComputeHeight_Segmented_MapForClipMap
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
2025-06-10 20:14:47 +08:00
|
|
|
|
|
|
|
|
|
>// 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
|
2025-06-10 18:47:39 +08:00
|
|
|
|
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
2025-06-10 18:47:39 +08:00
|
|
|
|
### 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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
```
|
2025-06-10 14:59:07 +08:00
|
|
|
|
|
2025-06-10 17:02:58 +08:00
|
|
|
|
|
|
|
|
|
### InitializeReadBackDependencies
|
2025-06-10 18:47:39 +08:00
|
|
|
|
- 作用:初始化几个GPU数据回读用的RT。
|
|
|
|
|
- 调用顺序:BeginPlay() -> InitiateWorld() -> InitializeReadBackDependencies()
|
2025-06-10 17:02:58 +08:00
|
|
|
|
|
|
|
|
|
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。
|
2025-06-10 14:59:07 +08:00
|
|
|
|
### InitiateMaterials
|
2025-06-10 17:02:58 +08:00
|
|
|
|
作用:初始化`TArray<FClipMapMeshElement> Meshes;`的Material、`Producers`
|
|
|
|
|
调用顺序:BeginPlay() -> InitiateWorld() -> InitiateMaterials()
|
|
|
|
|
|
|
|
|
|
经过断点调试,会设置WorldSettings里的Material(地形Material)的HeightMap与NormalMap。
|