refactor(rendering): treat object id as top-level tooling pass

This commit is contained in:
2026-04-21 23:34:03 +08:00
parent 76452a9c73
commit 1bbbc22bcb
3 changed files with 53 additions and 4 deletions

View File

@@ -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`

View File

@@ -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<Passes::BuiltinObjectIdPass>());
}
RenderPipelineStageSupportContext BuildStageSupportContext(
const CameraFramePlan& plan,
CameraFrameStage stage) {
@@ -124,6 +133,10 @@ void CameraRenderer::ResetPipeline(std::unique_ptr<RenderPipeline> pipeline) {
&m_pipelineAsset);
}
if (m_pipeline != nullptr) {
ConfigureTopLevelToolingPasses(*m_pipeline);
}
m_managedPipelineEnvironmentGeneration =
UsesManagedPipelineBinding()
? GetGraphicsSettingsState().GetEnvironmentGeneration()

View File

@@ -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<Passes::BuiltinObjectIdPass>());
pipeline.SetCameraFrameStandalonePass(
CameraFrameStage::DepthOnly,
std::make_unique<Passes::BuiltinDepthOnlyPass>());