
什么时候用材质节点什么时候用贴图先看清两种方案的真实代价贴图 节点程序化 ───────────────────────────────────────────────────────────── 一次性成本 贴图制作时间美术画/烘焙 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 ModeShading ModelStatic SwitchStatic 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_AOpaque MI_BTranslucent这两个材质实例会使用不同的 Shader 变体和 PSO。所以准确说法是材质实例可以通过不同的静态参数组合形成不同变体但不会天然拥有所有变体。你不切到另一个静态分支那个分支一般不会进入当前 shader bytecode。 没有被材质实例使用的静态组合通常也不会在运行时占用 shader / PSO 内存。5. 普通参数和静态参数的区别普通动态参数例如颜色粗糙度金属度普通纹理参数通常不改变 Shader permutation 不改变 PSO静态参数例如Blend ModeShading ModelStatic SwitchStatic Component Mask是否启用 WPO 等功能通常可能改变 Shader permutation 可能改变 PSO6. 贴图不同是否会产生 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 和 HISMISMInstanced Static Mesh适合批量绘制大量相同 Static Mesh。HISMHierarchical 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材质中