refactor(srp): formalize default renderer asset composition
This commit is contained in:
@@ -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 秒通过
|
||||
@@ -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
|
||||
|
||||
@@ -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<ScriptableRendererData>();
|
||||
}
|
||||
|
||||
protected virtual bool UsesExplicitFullscreenStagePlanning()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void ResetRendererDataToDefault()
|
||||
{
|
||||
ScriptableRendererData[] defaultRendererDataList =
|
||||
CreateDefaultRendererDataList() ??
|
||||
Array.Empty<ScriptableRendererData>();
|
||||
rendererDataList = defaultRendererDataList;
|
||||
defaultRendererIndex = 0;
|
||||
}
|
||||
|
||||
internal ScriptableRendererData GetDefaultRendererData()
|
||||
{
|
||||
return m_rendererDataCollection.GetDefaultRendererData(
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
using XCEngine;
|
||||
|
||||
namespace XCEngine.Rendering.Universal
|
||||
{
|
||||
internal static class UniversalDefaultRendererDataFactory
|
||||
{
|
||||
public static UniversalRendererData
|
||||
CreateDefaultRendererData()
|
||||
{
|
||||
return ScriptableObject
|
||||
.CreateInstance<UniversalRendererData>() ??
|
||||
new UniversalRendererData();
|
||||
}
|
||||
|
||||
public static ScriptableRendererData[]
|
||||
CreateDefaultRendererDataList()
|
||||
{
|
||||
UniversalRendererData rendererData =
|
||||
CreateDefaultRendererData();
|
||||
return new ScriptableRendererData[]
|
||||
{
|
||||
rendererData
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<UniversalRendererData>() ??
|
||||
new UniversalRendererData();
|
||||
return UniversalDefaultRendererDataFactory
|
||||
.CreateDefaultRendererData();
|
||||
}
|
||||
|
||||
protected override ScriptableRendererData[]
|
||||
CreateDefaultRendererDataList()
|
||||
{
|
||||
return UniversalDefaultRendererDataFactory
|
||||
.CreateDefaultRendererDataList();
|
||||
}
|
||||
|
||||
protected override int ResolveRendererIndex(
|
||||
|
||||
Reference in New Issue
Block a user