From 1bbbc22bcb61529ca23e7095d64975ad48b5ed9e Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 21 Apr 2026 23:34:03 +0800 Subject: [PATCH] refactor(rendering): treat object id as top-level tooling pass --- ...ToolingBoundaryPlan_2026-04-21_完成归档.md | 40 +++++++++++++++++++ .../Rendering/Execution/CameraRenderer.cpp | 13 ++++++ .../Internal/BuiltinForwardSceneSetup.cpp | 4 -- 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 docs/used/SRP_URP_ObjectIdToolingBoundaryPlan_2026-04-21_完成归档.md diff --git a/docs/used/SRP_URP_ObjectIdToolingBoundaryPlan_2026-04-21_完成归档.md b/docs/used/SRP_URP_ObjectIdToolingBoundaryPlan_2026-04-21_完成归档.md new file mode 100644 index 00000000..c698fe9b --- /dev/null +++ b/docs/used/SRP_URP_ObjectIdToolingBoundaryPlan_2026-04-21_完成归档.md @@ -0,0 +1,40 @@ +# SRP/URP ObjectId Tooling Boundary Plan + +日期:2026-04-21 + +## 背景 + +`ObjectId` 这条链路当前主要用于 editor 视口拾取和选中描边,不属于 runtime SRP/URP 主渲染能力。 + +上一阶段把 standalone stage fallback ownership 从 host 往 backend 收口时,`ObjectId` 也一起落到了 builtin forward backend setup 中。这个方向不对: + +1. `ShadowCaster` / `DepthOnly` 属于 scene rendering stage,适合归到 backend 或 renderer 规划边界。 +2. `ObjectId` 更像 tooling render request,只在 editor / picking / selection 这条链路上使用。 +3. 如果把 `ObjectId` 继续和 shadow/depth 混在一起,会误导后续 SRP/URP 分层,让它看起来像 URP runtime feature。 + +## 目标 + +1. 把 `ObjectId` 从 builtin forward backend ownership 中移出。 +2. 把 `ObjectId` 重新挂到顶层 `CameraRenderer` 执行入口,作为通用 tooling pass 能力。 +3. 保持 editor 视口 object-id picking 行为不变。 + +## 实施步骤 + +1. 从 `BuiltinForwardSceneSetup` 中移除 `BuiltinObjectIdPass` 注册。 +2. 在 `CameraRenderer` 顶层 pipeline 绑定路径中补上 object-id tooling pass 注入。 +3. 重新编译旧版 `XCEditor`,运行旧版 editor 冒烟并确认 `SceneReady`。 + +## 完成判定 + +1. builtin forward backend 不再拥有 `ObjectId` fallback 注册。 +2. `CameraRenderer` 创建或切换顶层 pipeline 后,会显式提供 `ObjectId` tooling pass。 +3. 旧版 editor 编译通过并冒烟通过。 + +## 结果 + +1. `BuiltinForwardSceneSetup` 已移除 `BuiltinObjectIdPass` 注册,builtin forward backend 现在只保留 scene-stage 相关 fallback。 +2. `CameraRenderer` 在顶层 pipeline 绑定路径中统一注入 `ObjectId` standalone pass,语义上归为 tooling/editor request。 +3. 验证结果: + `cmake --build . --config Debug --target XCEditor` 通过。 + 旧版 editor 冒烟 15 秒通过。 + 日志结果:`SceneReady elapsed_ms=5621 first_frame_ms=602`。 diff --git a/engine/src/Rendering/Execution/CameraRenderer.cpp b/engine/src/Rendering/Execution/CameraRenderer.cpp index 5bf4dd82..de5d08ed 100644 --- a/engine/src/Rendering/Execution/CameraRenderer.cpp +++ b/engine/src/Rendering/Execution/CameraRenderer.cpp @@ -5,6 +5,7 @@ #include "Rendering/Execution/Internal/CameraFrameGraph/Executor.h" #include "Rendering/GraphicsSettingsState.h" #include "Rendering/Internal/RenderPipelineFactory.h" +#include "Rendering/Passes/BuiltinObjectIdPass.h" #include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include "Rendering/RenderPipelineAsset.h" #include "Rendering/RenderSurface.h" @@ -29,6 +30,14 @@ bool IsManagedPipelineAsset( pipelineAsset.get()) != nullptr; } +void ConfigureTopLevelToolingPasses(RenderPipeline& pipeline) { + // Object-id is a tooling/editor request. It should live on the + // top-level pipeline used by CameraRenderer, not on a scene backend. + pipeline.SetCameraFrameStandalonePass( + CameraFrameStage::ObjectId, + std::make_unique()); +} + RenderPipelineStageSupportContext BuildStageSupportContext( const CameraFramePlan& plan, CameraFrameStage stage) { @@ -124,6 +133,10 @@ void CameraRenderer::ResetPipeline(std::unique_ptr pipeline) { &m_pipelineAsset); } + if (m_pipeline != nullptr) { + ConfigureTopLevelToolingPasses(*m_pipeline); + } + m_managedPipelineEnvironmentGeneration = UsesManagedPipelineBinding() ? GetGraphicsSettingsState().GetEnvironmentGeneration() diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp index c60e84ee..f4cb8641 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp @@ -3,7 +3,6 @@ #include "Rendering/Features/BuiltinGaussianSplatPass.h" #include "Rendering/Features/BuiltinVolumetricPass.h" #include "Rendering/Passes/BuiltinDepthOnlyPass.h" -#include "Rendering/Passes/BuiltinObjectIdPass.h" #include "Rendering/Passes/BuiltinShadowCasterPass.h" #include "Rendering/Pipelines/BuiltinForwardPipeline.h" @@ -18,9 +17,6 @@ namespace { void ConfigureBuiltinForwardStandalonePasses( BuiltinForwardPipeline& pipeline) { - pipeline.SetCameraFrameStandalonePass( - CameraFrameStage::ObjectId, - std::make_unique()); pipeline.SetCameraFrameStandalonePass( CameraFrameStage::DepthOnly, std::make_unique());