UE5 母材质 编写笔记
2026/9/6 10:25:51 网站建设 项目流程

什么时候用材质节点什么时候用贴图?

先看清两种方案的真实代价

贴图 节点(程序化) ───────────────────────────────────────────────────────────── 一次性成本 贴图制作时间(美术画/烘焙) TA 写材质图的时间 每帧成本 纹理采样 + 显存带宽 ALU 指令数 内存成本 显存占用(持久) 无(零内存) 变化能力 改贴图 = 重新导入 改参数 = 即时 精度 看分辨率 数学精确 独特性 每张贴图都是唯一的 同参数 = 同结果

核心公式:

贴图贵在带宽和内存,节点贵在指令数。带宽是 GPU 最稀缺的资源,ALU 反而是最充裕的。


判断框架:什么必须用贴图

必须用贴图的 4 种情况

① 无法用数学描述的信息

人脸肤色分布、衣服褶皱、木纹的年轮走势 → 没有数学公式能描述"这张特定的脸" → 只能贴图

② 一次性烘焙比实时算便宜很多

高模烘焙的 AO、曲率、厚度、Normal → 离线烘焙 1 秒 = 运行时永远不花钱 → 这个交易永远是划算的

③ 美术需要手绘/精细控制

角色脸上的伤痕位置、Logo 的具体形状 → 美术要在 Photoshop 里一像素一像素地画 → 不能用 Noise 节点拼

④ 低频 + 需要多种不同变化

同一个材质,不同道具需要不同的图案(不换 Shader) → 换贴图 = 不增加 Shader 排列数 → 换逻辑 = 多一个 Static Switch = 多一种 Shader 排列

判断框架:什么应该用节点

应该用节点的 5 种情况

① 数学规律明确的图案

棋盘格、条纹、同心圆、网格线、渐变 → 3-5 条指令能解决的事,用贴图纯属浪费

② 需要实时动态变化的

碰撞点的冲击波扩散、能量盾的扫描线、 时间驱动的溶解效果 → 贴图做不到(除非用 Flipbook,但那也是多张贴图)

③ 高频重复 + 大面积使用

地面的碎石纹理、墙体剥落、锈迹斑斑 → 如果贴图要覆盖整个场景 → 纹理内存爆炸 → 用节点程序化生成 → 零内存,平铺到任意大小

④ 作为细节叠加而非主体

细节法线(Detail Normal)、微粗糙度变化 → 一张 256×256 的小贴图叠加在 UV 上 → 成本 ≈ 1 次采样 + 2-3 条 Blend 指令 → 性价比极高

UE5 母材质以及母材质 - 材质实例 合批条件

材质实例、Shader 变体与 PSO 笔记

1. 母材质的作用

母材质主要用于:

  • 复用材质节点和 Shader 逻辑。
  • 统一材质效果和参数。
  • 降低材质维护成本。
  • 控制 Shader permutation 数量。
  • 方便后续统一修改。

但:

有母材质 ≠ 一定能合批 Draw Call

母材质主要解决的是材质逻辑复用,不是直接解决角色 Draw Call。

2. 材质实例的作用

材质实例可以修改:

  • 颜色
  • 粗糙度
  • 金属度
  • 普通纹理
  • 其他材质参数

普通参数变化通常不会产生新的 Shader permutation。

但材质实例也可以覆盖部分静态属性,例如:

  • Blend Mode
  • Shading Model
  • Static Switch
  • Static Component Mask
  • 是否使用某些静态功能

这些静态属性变化可能产生新的 Shader permutation 和 PSO。

3. Shader permutation 是什么

Shader permutation 就是 Shader 的编译变体。

Shader 结构 + 静态编译条件 = 一个 Shader permutation

例如:

UseDetailNormal = true UseDetailNormal = false

会生成两个不同的 Shader 变体。

多个 Static Switch 组合时,变体数量可能快速增加:

5 个二值 Static Switch → 理论上最多 2^5 = 32 种组合

4. 材质实例不是自带所有变体

一个材质实例不是同时包含所有 Blend Mode 或 Static Switch 变体。

它实际使用的是:

当前静态参数组合 → 对应的一套 Shader permutation / PSO

例如:

MI_A:Opaque MI_B:Translucent

这两个材质实例会使用不同的 Shader 变体和 PSO。

所以准确说法是:

材质实例可以通过不同的静态参数组合形成不同变体,但不会天然拥有所有变体。

你不切到另一个静态分支,那个分支一般不会进入当前 shader bytecode。 没有被材质实例使用的静态组合,通常也不会在运行时占用 shader / PSO 内存。

5. 普通参数和静态参数的区别

普通动态参数

例如:

  • 颜色
  • 粗糙度
  • 金属度
  • 普通纹理参数

通常:

不改变 Shader permutation 不改变 PSO

静态参数

例如:

  • Blend Mode
  • Shading Model
  • Static Switch
  • Static Component Mask
  • 是否启用 WPO 等功能

通常:

可能改变 Shader permutation 可能改变 PSO

6. 贴图不同是否会产生 PSO 变体

如果两个材质实例:

来自同一个母材质 + 只使用不同普通贴图 + 其他参数和静态状态相同

通常可以:

使用相同 Shader permutation 复用相同或兼容的 PSO

但是:

纹理绑定不同 → 通常仍然是不同 Draw Call

也就是说:

贴图不同 → 通常影响材质绑定和 Draw Call 静态参数不同 → 影响 Shader permutation 和 PSO

特殊情况可能改变变体,例如:

  • 普通 Texture2D 和 Virtual Texture 的使用方式不同。
  • 采样类型不同。
  • Static Switch 决定是否使用某张贴图。
  • Blend Mode 或 Shading Model 不同。

7. PSO 与 Draw Call 的区别

PSO 相同 ≠ 一定可以合并 Draw Call

要合并 Draw Call,通常还需要:

  • 相同 Mesh。
  • 相同 Mesh Section。
  • 相同材质资源绑定。
  • 相同纹理和 Sampler。
  • 相同 Vertex Factory。
  • 相同渲染 Pass。
  • 对象差异可以通过实例数据传入。

8. 角色材质为什么难以合批

角色通常是 Skeletal Mesh,具有:

  • 独立骨骼姿势。
  • 多个身体部位。
  • 不同贴图。
  • 多个 Material Slot。
  • 多个 Mesh Section。
  • 不同装备和材质状态。

因此角色之间的传统 Draw Call 合批能力比较有限。

角色优化通常优先考虑:

减少 Material Slot 减少 Mesh Section 减少纹理采样 减少 Shader 指令 减少 Static Switch 减少不必要的材质功能

9. ISM 和 HISM

ISM

Instanced Static Mesh,适合批量绘制大量相同 Static Mesh。

HISM

Hierarchical Instanced Static Mesh,在 ISM 基础上增加空间层级剔除,适合大范围分布的大量静态物体。

典型用途:

  • 球体
  • 树木
  • 岩石
  • 路灯
  • 大量重复装饰物

ISM/HISM 主要用于 Static Mesh,不适合直接用于每个角色都有独立骨骼动画的 Skeletal Mesh。

10. 角色和 ISM/HISM 的关系

对于普通静态物体:

同一个 Mesh + 同一个 MI + ISM/HISM + Per Instance Custom Data

可以让每个实例拥有不同颜色等数据,同时保持较好的批处理能力。

但对于角色:

不同角色 + 独立骨骼动画 + 不同贴图

通常不能直接使用 ISM/HISM,也不应把角色 Draw Call 优化完全建立在传统实例化合批上。

11. 不做母材质的影响

如果每个角色都创建独立材质:

独立材质数量增加 → Shader Map 管理增加 → 编译和缓存成本增加 → 维护成本增加

如果每个材质的 Shader 功能也不同:

材质结构不同 → Shader permutation 增加 → PSO 种类增加

但如果独立材质只是换贴图:

通常不会因为贴图本身产生新的 permutation

主要代价是:

  • 材质资源重复。
  • 维护困难。
  • 不利于统一优化。
  • 不一定减少 Draw Call。

12. 每个角色专用材质什么时候合理

适合以下情况:

  • 角色数量较少。
  • 每个角色效果差异很大。
  • 可以删除大量不需要的材质功能。
  • 能减少纹理采样和 Shader 指令。
  • 项目不依赖角色之间的 Draw Call 合批。

如果只是复制相同材质节点,然后替换贴图,性能收益通常有限。

更折中的方式是按类型建立少量母材质:

M_Character_Skin M_Character_Cloth M_Character_Armor M_Character_Hair

角色再使用对应的材质实例。

最终结论

母材质: 复用材质逻辑,控制 Shader 结构和静态变体 材质实例: 复用材质逻辑,修改具体参数 Shader permutation: Shader 的编译变体 PSO: 固定 GPU 管线状态 Draw Call: 一次实际绘制提交

最关键的三句话:

普通贴图不同,通常不会产生新的 PSO,但会影响材质绑定和 Draw Call。

Static Switch、Blend Mode、Shading Model 等静态属性不同,才更容易产生新的 Shader permutation 和 PSO。

对角色来说,重点通常不是角色之间合批,而是减少 Material Slot、Mesh Section、材质采样和 Shader 复杂度。

所以如果两个角色都用同一个母材质、同一套静态开关、同一个 Blend Mode、同一个 Shading Model,只是材质实例里换了 BaseColor / Normal / ORM 贴图,通常:

不会产生新的 shader 不会产生新的 PSO 但会产生不同的材质资源绑定

不过它确实会影响 Draw Call/合批:

同 mesh + 同 material instance + 同贴图:更容易合批/实例化 同 mesh + 同母材质但不同 material instance / 不同贴图:通常需要不同 draw

更准确说,贴图不同不是“直接增加 PSO”,而是让每次绘制前绑定的资源不同,因此 UE 很难把它们当成完全相同的 draw 来合并。

在substrate材质中:

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询