Files
XCEngine/docs/used/Renderer模块_Material与Shader资产模型暂不满足SRP演进需求.md
2026-03-29 01:36:53 +08:00

3.4 KiB
Raw Blame History

Renderer模块 Material与Shader资产模型暂不满足SRP演进需求

1. 问题定义

当前资源层已经具备:

  • Material
  • Shader
  • Texture

但现有模型仍然偏“最小资源容器”,尚不足以直接承接未来 Unity 风格 Renderer / SRP 的完整需求。

当前最典型的问题是:

  • Shader 更像“单个 stage shader 资源”
  • Material 更像“shader 引用 + 属性包”
  • 资产层缺少 pass / tag / render state / render queue 语义

2. 当前现状

从现有实现看:

Shader

当前 Shader 资源主要描述:

  • shader type
  • shader language
  • source / compiled binary
  • uniforms / attributes

这更接近“单个 shader stage 对象”,而不是面向渲染管线选择的 shader asset。

Material

当前 Material 资源主要描述:

  • 一个 Shader 引用
  • 属性表
  • 纹理绑定表

当前 MaterialLoader 也只解析最基础的 "shader" 字段。


3. 为什么这会影响未来 Renderer / SRP

在未来的 Unity 风格渲染体系中Renderer / SRP 至少需要下列能力:

  • 根据 shader pass/tag 选择绘制路径
  • 区分 opaque / transparent / shadow caster / depth only 等 pass
  • 用 render queue 控制排序层级
  • 用 render state 描述 cull / blend / ztest / zwrite
  • 为后续 keyword / variant 留空间

如果材质 / shader 资产模型长期停留在当前结构,会导致:

  • 内建 forward 渲染可以临时跑起来
  • 但未来一旦上 SRP就必须大规模重构资源资产模型

这会影响:

  • Renderer
  • Material 资源格式
  • Shader 导入格式
  • editor 材质面板
  • 未来 C# SRP 的 pass 选择逻辑

4. 建议方向

4.1 不要让 Shader 永远停留在“单 stage 资源”

后续建议演进到更面向渲染管线的概念,例如:

  • ShaderAsset
  • ShaderPass
  • 每个 pass 包含 vertex / fragment 等 stage 组合
  • 每个 pass 具备 tag 与 render state 描述

4.2 Material 应逐步获得 renderer 需要的元数据

后续建议补充:

  • render queue
  • pass 相关 tag / override
  • render state override
  • shader keyword / variant 预留位

4.3 第一阶段可以先不一次性做全

但即使第一阶段只做 UnlitTexture / SimpleLit,也建议:

  • 不把格式彻底写死成只有 "shader" 这一个入口
  • 为 future pass/tag 结构预留升级路径

换句话说:

  • 当前阶段可以简化实现
  • 但不能封死演进路线

5. 与 Unity 风格的关系

未来如果要在 C# 层做接近 Unity 的 SRPshader pass 选择是核心能力之一。

例如:

  • ShaderTagId
  • DrawingSettings
  • FilteringSettings
  • renderer list / pass filtering

这些能力都要求材质与 shader 资产层至少能表达“pass/tag/state”。

因此,这个问题虽然不一定是 Renderer v0 第一周就要全量解决,但必须在设计阶段明确记录。


6. 建议验收标准

进入下一阶段时,至少应达到以下其中一档:

档位 A最小可演进

  • 明确存在“shader pass”概念
  • 材质资产格式有升级空间
  • 内建 pipeline 能按 pass 选择绘制

档位 B更接近 SRP

  • 具备 pass + tag + render state + queue
  • 为 future keyword / variant 留接口

7. 优先级

中到高。

它不一定阻塞 Renderer v0 的第一步落地,但如果完全忽略,未来做 C# SRP 时会出现明显返工。