refactor(rendering): treat object id as top-level tooling pass
This commit is contained in:
@@ -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`。
|
||||
@@ -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()
|
||||
|
||||
@@ -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>());
|
||||
|
||||
Reference in New Issue
Block a user