diff --git a/docs/used/SRP_URP_DefaultRendererCompositionContractPlan_2026-04-22_完成归档.md b/docs/used/SRP_URP_DefaultRendererCompositionContractPlan_2026-04-22_完成归档.md new file mode 100644 index 00000000..037f16e2 --- /dev/null +++ b/docs/used/SRP_URP_DefaultRendererCompositionContractPlan_2026-04-22_完成归档.md @@ -0,0 +1,66 @@ +# SRP / URP Default Renderer Composition Contract Plan + +时间:2026-04-22 + +## 背景 + +上一阶段已经让 `UniversalRenderPipelineAsset` 在构造时显式创建默认 renderer data list, +但当前默认组合 contract 仍然不完整: + +1. 默认组合仍然被拆成 “rendererDataList + 固定 `defaultRendererIndex = 0`” +2. `ResetRendererDataToDefault()` 隐式假定默认 renderer 永远在 0 号槽位 +3. 这会限制后续多 renderer variant / renderer preset 的正式表达 + +如果未来默认组合需要同时带出多个 renderer data,这两个信息本来就应该一起返回。 + +## 目标 + +把默认 renderer 资产组合正式收成 composition contract。 + +阶段完成后要达到: + +1. 默认 renderer data list 和默认 renderer index 一起表达 +2. `RendererBackedRenderPipelineAsset` 不再写死默认 index 为 0 +3. `UniversalRenderPipelineAsset` 的默认组合通过正式 composition 工厂返回 +4. 为未来多 renderer variant 的默认组合提供稳定接缝 + +## 范围 + +本阶段只处理默认 renderer composition contract,不做: + +- deferred renderer +- editor UI +- 运行时 renderer selection 语义变更 +- public API 大改 + +## 实施步骤 + +### 1. 新增 ScriptableRendererDataComposition + +职责: + +- 表达默认 renderer data list +- 表达默认 renderer index + +### 2. 接入 RendererBackedRenderPipelineAsset + +迁移内容: + +- 默认组合创建 +- `ResetRendererDataToDefault()` + +### 3. 更新 Universal 默认工厂 + +目标: + +- 明确返回默认 renderer composition +- 保持当前行为不变,但去掉固定 0 号假设 + +## 完成标准 + +满足以下条件才算本阶段收口: + +1. 默认 renderer 组合 contract 包含 list + default index +2. `RendererBackedRenderPipelineAsset` 不再在默认重置时硬编码 `defaultRendererIndex = 0` +3. `XCEditor` 编译通过 +4. old editor 冒烟至少 10 秒通过 diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index 169075c3..a6dae341 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -252,6 +252,7 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRenderer.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererDataCollection.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererDataComposition.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererFeatureCollection.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererFeature.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/StageColorData.cs diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs index 8f0c4b8e..2df35b2e 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs @@ -152,6 +152,19 @@ namespace XCEngine.Rendering.Universal : Array.Empty(); } + protected virtual ScriptableRendererDataComposition + CreateDefaultRendererDataComposition() + { + ScriptableRendererData[] defaultRendererDataList = + CreateDefaultRendererDataList() ?? + Array.Empty(); + return new ScriptableRendererDataComposition( + defaultRendererDataList, + defaultRendererDataList.Length > 0 + ? 0 + : -1); + } + protected virtual bool UsesExplicitFullscreenStagePlanning() { return true; @@ -159,11 +172,11 @@ namespace XCEngine.Rendering.Universal protected void ResetRendererDataToDefault() { - ScriptableRendererData[] defaultRendererDataList = - CreateDefaultRendererDataList() ?? - Array.Empty(); - rendererDataList = defaultRendererDataList; - defaultRendererIndex = 0; + ScriptableRendererDataComposition composition = + CreateDefaultRendererDataComposition(); + rendererDataList = composition.rendererDataList; + defaultRendererIndex = + composition.defaultRendererIndex; } internal ScriptableRendererData GetDefaultRendererData() diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererDataComposition.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererDataComposition.cs new file mode 100644 index 00000000..114af8ea --- /dev/null +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/ScriptableRendererDataComposition.cs @@ -0,0 +1,21 @@ +using System; + +namespace XCEngine.Rendering.Universal +{ + public struct ScriptableRendererDataComposition + { + public readonly ScriptableRendererData[] rendererDataList; + public readonly int defaultRendererIndex; + + public ScriptableRendererDataComposition( + ScriptableRendererData[] rendererDataList, + int defaultRendererIndex) + { + this.rendererDataList = + rendererDataList ?? + Array.Empty(); + this.defaultRendererIndex = + defaultRendererIndex; + } + } +} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs index d2d448cb..7d77d4f1 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs @@ -22,5 +22,13 @@ namespace XCEngine.Rendering.Universal rendererData }; } + + public static ScriptableRendererDataComposition + CreateDefaultRendererDataComposition() + { + return new ScriptableRendererDataComposition( + CreateDefaultRendererDataList(), + 0); + } } } diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs index 262b607c..aa19a3e8 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs @@ -92,11 +92,11 @@ namespace XCEngine.Rendering.Universal .CreateDefaultRendererData(); } - protected override ScriptableRendererData[] - CreateDefaultRendererDataList() + protected override ScriptableRendererDataComposition + CreateDefaultRendererDataComposition() { return UniversalDefaultRendererDataFactory - .CreateDefaultRendererDataList(); + .CreateDefaultRendererDataComposition(); } protected override int ResolveRendererIndex(