From 6f370beb0a8fccd48f4bcf9d76c02a7dc82b0b9a Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 22 Apr 2026 12:44:39 +0800 Subject: [PATCH] refactor(srp): formalize default renderer asset composition --- ...ssetCompositionPlan_2026-04-22_完成归档.md | 67 +++++++++++++++++++ managed/CMakeLists.txt | 1 + .../RendererBackedRenderPipelineAsset.cs | 22 ++++++ .../UniversalDefaultRendererDataFactory.cs | 26 +++++++ .../Universal/UniversalRenderPipelineAsset.cs | 13 +++- 5 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 docs/used/SRP_URP_DefaultRendererAssetCompositionPlan_2026-04-22_完成归档.md create mode 100644 managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs diff --git a/docs/used/SRP_URP_DefaultRendererAssetCompositionPlan_2026-04-22_完成归档.md b/docs/used/SRP_URP_DefaultRendererAssetCompositionPlan_2026-04-22_完成归档.md new file mode 100644 index 00000000..16cdedc5 --- /dev/null +++ b/docs/used/SRP_URP_DefaultRendererAssetCompositionPlan_2026-04-22_完成归档.md @@ -0,0 +1,67 @@ +# SRP / URP Default Renderer Asset Composition Plan + +时间:2026-04-22 + +## 背景 + +当前 `RendererBackedRenderPipelineAsset` 已经把 renderer data collection 的运行时管理收口了, +但 `UniversalRenderPipelineAsset` 的默认 renderer 资产组合仍然是隐式的: + +1. 新建 asset 时,`rendererDataList` 默认还是空 +2. 默认 renderer data 主要靠 runtime resolve/fallback 时再补出来 +3. 这会让 asset authoring 和 runtime bootstrap 混在一起 + +这不够像 Unity 风格。Unity 的 pipeline asset 虽然也有 default renderer/fallback 语义, +但“这个 asset 默认有哪些 renderer data”本身应该是 asset 侧明确表达的,而不是运行时临时补洞。 + +## 目标 + +把默认 renderer data list 正式收成 asset 默认组合。 + +阶段完成后要达到: + +1. `RendererBackedRenderPipelineAsset` 拥有明确的默认 renderer data list 重置入口 +2. `UniversalRenderPipelineAsset` 通过专门工厂表达默认 renderer 组合 +3. 新建 `UniversalRenderPipelineAsset` 时就有正式的默认 renderer data 列表 +4. runtime fallback 只负责容错,不再承担默认 authoring 组合表达 + +## 范围 + +本阶段只处理默认 renderer asset 组合表达,不做: + +- deferred renderer +- renderer inspector / editor UI +- public API 大改 +- 阴影与后处理能力扩展 + +## 实施步骤 + +### 1. 给 RendererBackedRenderPipelineAsset 增加默认重置入口 + +职责: + +- 允许 asset 明确重置到默认 renderer data list +- 把默认 list 构造和 runtime fallback 区分开 + +### 2. 抽出 Universal 默认 renderer data 工厂 + +职责: + +- 创建默认 `UniversalRendererData` +- 返回默认 renderer data list + +### 3. 让 UniversalRenderPipelineAsset 显式初始化默认组合 + +目标: + +- asset 构造时就有明确默认 renderer data +- 为未来 renderer variant / preset 演进保留稳定落点 + +## 完成标准 + +满足以下条件才算本阶段收口: + +1. `UniversalRenderPipelineAsset` 默认 renderer 组合不再依赖 runtime 隐式补全 +2. 默认 renderer data list 有专门工厂落点 +3. `XCEditor` 编译通过 +4. old editor 冒烟至少 10 秒通过 diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index eb9e7d83..169075c3 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -257,6 +257,7 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/StageColorData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalAdditionalCameraData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererFeatureFactory.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalFinalColorSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalFinalOutputBlock.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalMainSceneData.cs diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs index 4843b0ff..8f0c4b8e 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs @@ -139,11 +139,33 @@ namespace XCEngine.Rendering.Universal return null; } + protected virtual ScriptableRendererData[] + CreateDefaultRendererDataList() + { + ScriptableRendererData defaultRendererData = + CreateDefaultRendererData(); + return defaultRendererData != null + ? new ScriptableRendererData[] + { + defaultRendererData + } + : Array.Empty(); + } + protected virtual bool UsesExplicitFullscreenStagePlanning() { return true; } + protected void ResetRendererDataToDefault() + { + ScriptableRendererData[] defaultRendererDataList = + CreateDefaultRendererDataList() ?? + Array.Empty(); + rendererDataList = defaultRendererDataList; + defaultRendererIndex = 0; + } + internal ScriptableRendererData GetDefaultRendererData() { return m_rendererDataCollection.GetDefaultRendererData( diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs new file mode 100644 index 00000000..d2d448cb --- /dev/null +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererDataFactory.cs @@ -0,0 +1,26 @@ +using XCEngine; + +namespace XCEngine.Rendering.Universal +{ + internal static class UniversalDefaultRendererDataFactory + { + public static UniversalRendererData + CreateDefaultRendererData() + { + return ScriptableObject + .CreateInstance() ?? + new UniversalRendererData(); + } + + public static ScriptableRendererData[] + CreateDefaultRendererDataList() + { + UniversalRendererData rendererData = + CreateDefaultRendererData(); + return new ScriptableRendererData[] + { + rendererData + }; + } + } +} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs index e0ebef76..262b607c 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs @@ -15,6 +15,7 @@ namespace XCEngine.Rendering.Universal UniversalShadowSettings.CreateDefault(); finalColor = UniversalFinalColorSettings.CreateDefault(); + ResetRendererDataToDefault(); } protected override ScriptableRenderPipeline @@ -87,9 +88,15 @@ namespace XCEngine.Rendering.Universal protected override ScriptableRendererData CreateDefaultRendererData() { - return ScriptableObject - .CreateInstance() ?? - new UniversalRendererData(); + return UniversalDefaultRendererDataFactory + .CreateDefaultRendererData(); + } + + protected override ScriptableRendererData[] + CreateDefaultRendererDataList() + { + return UniversalDefaultRendererDataFactory + .CreateDefaultRendererDataList(); } protected override int ResolveRendererIndex(