From 39c710b19c1669dfd1f5d82b17b46209f8960189 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Thu, 14 Nov 2024 12:59:18 +0800 Subject: [PATCH] vault backup: 2024-11-14 12:59:18 --- .../DynamicMeshDraw.md | 0 .../MeshDraw.md | 0 .../UE5.5 MeshDraw&SceneProxy探索.md | 91 +++++++++++++++++++ .../材质中PassSwitch节点实现方式.md | 0 4 files changed, 91 insertions(+) rename 03-UnrealEngine/Rendering/RenderingPipeline/{ => Materials&MeshDraw}/DynamicMeshDraw.md (100%) rename 03-UnrealEngine/Rendering/RenderingPipeline/{Materials => Materials&MeshDraw}/MeshDraw.md (100%) create mode 100644 03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/UE5.5 MeshDraw&SceneProxy探索.md rename 03-UnrealEngine/Rendering/RenderingPipeline/{Materials => Materials&MeshDraw}/材质中PassSwitch节点实现方式.md (100%) diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/DynamicMeshDraw.md b/03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/DynamicMeshDraw.md similarity index 100% rename from 03-UnrealEngine/Rendering/RenderingPipeline/DynamicMeshDraw.md rename to 03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/DynamicMeshDraw.md diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/Materials/MeshDraw.md b/03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/MeshDraw.md similarity index 100% rename from 03-UnrealEngine/Rendering/RenderingPipeline/Materials/MeshDraw.md rename to 03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/MeshDraw.md diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/UE5.5 MeshDraw&SceneProxy探索.md b/03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/UE5.5 MeshDraw&SceneProxy探索.md new file mode 100644 index 0000000..e449457 --- /dev/null +++ b/03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/UE5.5 MeshDraw&SceneProxy探索.md @@ -0,0 +1,91 @@ +--- +title: Untitled +date: 2024-11-14 12:19:36 +excerpt: +tags: +rating: ⭐ +--- +# 前言 +探索思路: +- [ ] SceneProxy收集机制的改变。 +- [ ] GetDynamicMeshElements的调用方式。 +- [ ] 在SendRenderDynamicData_Concurrent中添加(模仿USkeletalMeshComponent::SendRenderDynamicData_Concurrent()与FDebugSkelMeshSceneProxy) + +# GetDynamicMeshElements +看得出主要在FDynamicMeshElementContext::GatherDynamicMeshElementsForPrimitive()中调用Primitive->Proxy->GetDynamicMeshElements()。 + +```c++ +UE::Tasks::FTask FDynamicMeshElementContext::LaunchAsyncTask(FDynamicPrimitiveIndexQueue* PrimitiveIndexQueue, UE::Tasks::ETaskPriority TaskPriority) +{ + return Pipe.Launch(UE_SOURCE_LOCATION, [this, PrimitiveIndexQueue] + { + FOptionalTaskTagScope Scope(ETaskTag::EParallelRenderingThread); + FDynamicPrimitiveIndex PrimitiveIndex; + + while (PrimitiveIndexQueue->Pop(PrimitiveIndex)) + { + GatherDynamicMeshElementsForPrimitive(Primitives[PrimitiveIndex.Index], PrimitiveIndex.ViewMask); + } + +#if WITH_EDITOR + while (PrimitiveIndexQueue->PopEditor(PrimitiveIndex)) + { + GatherDynamicMeshElementsForEditorPrimitive(Primitives[PrimitiveIndex.Index], PrimitiveIndex.ViewMask); + } +#endif + }, TaskPriority); +} + +void FDynamicMeshElementContext::GatherDynamicMeshElementsForPrimitive(FPrimitiveSceneInfo* Primitive, uint8 ViewMask) +{ + SCOPED_NAMED_EVENT(DynamicPrimitive, FColor::Magenta); + + TArray> MeshBatchCountBefore; + MeshBatchCountBefore.SetNumUninitialized(Views.Num()); + for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) + { + MeshBatchCountBefore[ViewIndex] = MeshCollector.GetMeshBatchCount(ViewIndex); + } + + MeshCollector.SetPrimitive(Primitive->Proxy, Primitive->DefaultDynamicHitProxyId); + + // If Custom Render Passes aren't in use, there will be only one group, which is the common case. + if (ViewFamilyGroups.Num() == 1 || Primitive->Proxy->SinglePassGDME()) + { + Primitive->Proxy->GetDynamicMeshElements(FirstViewFamily.AllViews, FirstViewFamily, ViewMask, MeshCollector); + } + else + { + for (FViewFamilyGroup& Group : ViewFamilyGroups) + { + if (uint8 MaskedViewMask = ViewMask & Group.ViewSubsetMask) + { + Primitive->Proxy->GetDynamicMeshElements(FirstViewFamily.AllViews, *Group.Family, MaskedViewMask, MeshCollector); + } + } + } + + for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) + { + FViewInfo& View = *Views[ViewIndex]; + + if (ViewMask & (1 << ViewIndex)) + { + FDynamicPrimitive& DynamicPrimitive = DynamicPrimitives.Emplace_GetRef(); + DynamicPrimitive.PrimitiveIndex = Primitive->GetIndex(); + DynamicPrimitive.ViewIndex = ViewIndex; + DynamicPrimitive.StartElementIndex = MeshBatchCountBefore[ViewIndex]; + DynamicPrimitive.EndElementIndex = MeshCollector.GetMeshBatchCount(ViewIndex); + } + } +} +``` + +# SendRenderDynamicData_Concurrent + +## FDebugSkelMeshSceneProxy::GetDynamicMeshElements + + +# 其他? + +MeshBuilderSurface.GetMesh(GetLocalToWorld(), MatProxySurface, SDPG_Foreground, false, false, ViewIndex, Collector); \ No newline at end of file diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/Materials/材质中PassSwitch节点实现方式.md b/03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/材质中PassSwitch节点实现方式.md similarity index 100% rename from 03-UnrealEngine/Rendering/RenderingPipeline/Materials/材质中PassSwitch节点实现方式.md rename to 03-UnrealEngine/Rendering/RenderingPipeline/Materials&MeshDraw/材质中PassSwitch节点实现方式.md