
在 UE 里做卡通渲染很多团队都会卡在同一个十字路口要么改引擎的 Shading Model要么在主材质里堆 Custom Data 和材质函数。改引擎意味着团队里要长期养一个熟悉渲染源码的引擎组而且每次引擎升级都要重新适配堆 Custom Data 的结果是材质蓝图越来越复杂换个人接手根本不敢动。UE 5.8 把 Substrate 推到更靠前的位置本质上就是在解这个历史包袱。先说结论Substrate 不一定能让卡通画面变得更“卡”但它能把自定义渲染风格的工程量从引擎层下沉到材质层。过去你要改 C 才能实现的着色器模型现在可以在一张材质资产里用节点组装出来。这个变化比单纯多几个 Shading Model 选项重要得多。本文会从 Substrate 和传统 Shading Model 的本质差异讲起然后给出 UE 5.8 下的开启方式、卡通着色器的搭建思路、运行验证方法以及工程落地时最容易踩的坑。1. 传统 Shading Model 为什么成为卡通渲染的瓶颈在讲解 Substrate 之前需要先理解传统材质系统的问题。UE 的 Shading Model 本质上是一个枚举Default Lit、Subsurface、Clear Coat、Hair、Eye 等每个枚举对应引擎内部一套写死的漫反射、高光、间接光处理逻辑。材质编辑器里选择某个 Shading Model等于告诉引擎“请用这一整套光照公式处理该材质”。这套设计在早期很直接但随着渲染风格需求变多问题开始暴露新增一种风格需要修改引擎内部 ShadingModel 相关源码重新编译引擎所有材质共享一套全局光照分支为了适配特殊材质引擎内部往往要堆很多#if宏材质编辑器里能控制的只是枚举暴露出来的那几个参数更深的定制没有办法通过资产完成。社区很早就围绕这个痛点做了一些规避。最常见的做法是使用 Custom Shading Model配合 Custom Data 0 和 Custom Data 1 在材质编辑器中传参然后在引擎的 Shading Model 分支里写自己的光照逻辑。这套方案可以跑通但缺陷也很明显自定义 Shading Model 只能表达一种风格而且和官方 Shading Model 是互斥的。一个角色身上如果同时需要皮肤透射和卡通描边往往就要做取舍。Substrate 改变了这个局面。它不再把“用哪种光照模型”当成一个单选下拉框而是把材质本身拆成多个可组合的 BSDF 层。通俗地说传统 Shading Model 是食堂的固定套餐Substrate 则是自助餐你可以把漫反射、高光、透射、光泽等不同性质的层组合在一个材质里每一层还能单独控制。维度传统 Shading ModelSubstrate分类方式枚举预先定义BSDF 组合按需组装新增风格修改引擎源码材质资产内完成材质多样性一次性只能选一个模型可多层混合维护成本引擎升级成本高资产迁移成本相对可控性能预测相对固定需要看组合复杂度引擎版本要求所有版本5.4 起实验性引入5.8 更成熟从 5.4 引入 Substrate 到 5.8这套系统经历了几次迭代。目前整体仍然带有实验属性但它在材质表达上的灵活性已经非常清楚。真正适合使用它的场景不是“所有材质都用 Substrate”而是那些对材质表现有高度定制需求的游戏和影视项目卡通渲染正是最典型的候选者。2. Substrate 核心概念从枚举到 BSDF 组合Substrate 的底层概念并不复杂但它使用的名词比较新鲜。第一次接触时建议先记住几个关键词BSDF双向散射分布函数描述材质表面如何散射入射光。传统引擎里可以理解为一个光照模型在 Substrate 里则是一块可组合的“材质积木”。SlabSubstrate 中最基础的材质层代表一层有一定厚度、包含漫反射和高光属性的材质。一个普通角色皮肤可以拆成表面漫反射层、高光层、次表面散射层。混合节点将多个 BSDF 或 Slab 组合在一起的方式。横向混合可以类比 Photoshop 的图层混合纵向分层则可以理解成“上层材质覆盖下层材质”。节点资产Substrate 提供了一套可视化节点在材质编辑器里以类似普通材质节点的形式出现但其目的是描述 BSDF 组合而不是直接做颜色运算。用游戏开发类比更好理解。传统 Shading Model 就像你从商店里买固定配置的电脑品牌型号都定好了最多换换内存和硬盘Substrate 则是自己选 CPU、显卡、主板自由度高很多但装机难度和翻车概率也一起上来了。在 UE 5.8 中你可以在材质编辑器中使用类似 Strata 的节点体系来组装材质。具体节点名称在不同版本之间可能调整因为 5.4 到 5.8 之间 Substrate 的命名和内部结构一直在演进。但底层逻辑是稳定的先创建若干个最基础的材质层通过混合节点把多个层组合起来组合结果作为材质最终输出。这个过程中引擎不再需要为每一种组合预先生成一个 Shading Model 枚举。Substrate 在后台把材质网络编译成一个或多个 BSDF 树再喂给 Deferred 或 Forward 的渲染管线。这也是为什么 Substrate 材质可以表达“这层有透射、那层有清漆、这层高光很锐利”而传统 Shading Model 很难做到。3. 卡通渲染的本质不是一种材质而是一套分层决策很多人觉得卡通渲染就是把漫反射过渡从平滑变成硬边再加个描边。实际项目中远远不止这些。一个完整的卡通角色材质通常要拆成以下几层漫反射分层根据 NdotL 和阴影接收结果把亮度切成两段或三段形成漫画式明暗描边用来突出角色轮廓可以有法线外扩、后处理描边、材质深度描边等多种方案高光控制卡通风格往往要求高光形状锐利、位置可控不接受物理上完全正确的 GGX 高光面部阴影修正为了不让面部阴影变成奇怪形状通常需要单独的面部朝向控制、特殊阴影纹理或方向限制。传统方案中每一层可能都对应一套独立材质或后处理。有的团队用主材质加一堆开关有的团队直接改引擎加一个新的 Shading Model。改引擎的方案能解决画面问题但每次升级引擎都会遇到很大的适配成本。Substrate 对卡通渲染的真正价值在于它把这些原本散落在引擎代码里的分支逻辑整合成了材质节点上可以自由组合的层。漫反射分级可以在材质里用节点算出结果后传给 BSDF高光的锐利程度可以直接控制 Slab 的高光参数描边仍然可以用 World Position Offset 或后处理完成不强制依赖特定 Shading Model。需要特别提醒的是Substrate 改变的是材质的组装方式不是光照计算本身。如果你仍然使用默认的 GGX 光照模型Substrate 也不会自动生成卡通感。它提供的是一套更好的“控制台”但光照算法仍然需要你自己在材质层或光照模型层做决策。4. 环境准备在 UE 5.8 中开启 SubstrateSubstrate 目前在 UE 5.8 中仍然建议以独立项目方式验证不建议直接铺到正在制作中的大型生产项目。如果你打算跑通整套卡通渲染流程建议准备以下环境Windows 10/11 64 位系统UE 5.8 编辑器推荐使用源码版便于查看 Substrate 相关源码和调试支持 DX12 的显卡Substrate 需要 SM5 及以上特性确保项目使用 DX12 RHI不要使用 OpenGL 或移动端渲染路径。如果你使用 Epic Games Launcher 安装的 UE 5.8同样可以开启 Substrate但部分实验性开关和调试能力可能不如源码版完善。源码版的构建命令大致如下# 假设你已经有 UE 5.8 源码并配置好 Visual Studio 环境 Setup.bat GenerateProjectFiles.bat # 打开 UE5.sln选择 Development Editor 配置编译 # 或者使用 UnrealBuildTool 命令行构建 UnrealBuildTool.exe UE5Editor Win64 Development -ProjectYourProject.uproject构建完成后在编辑器中开启 Substrate 的路径也很直接打开项目设置Project Settings找到渲染Rendering分类查找与 Substrate 相关的选项启用后重启编辑器重启后新建或打开一个测试材质。需要注意的是不同版本的选项名称可能不同有的版本显示为 Substrate有的版本可能仍然叫 Strata。以你当前安装版本的编辑器界面为准不需要机械照搬。开启后建议先新建一个空白材质确认材质编辑器里出现了 Substrate 相关节点再进行后续改动。如果材质编辑器里找不到这些节点说明项目没有真正开启 Substrate或者当前 RHI 不支持。5. Substrate 卡通着色器的核心实现过程有了环境之后我们可以用一个最小但完整的示例跑通 Substrate 卡通着色器的搭建流程。这个示例不追求商业级画质目的是展示 Substrate 如何把一个需要改引擎的卡通效果变为材质层内的节点组合。5.1 创建基础卡通材质首先创建一个 Material材质域的 Shading Model 选择 Substrate 相关模型。不同版本选项名称可能不同但通常会在 Shading Model 下拉框中看到与 Substrate/Strata 相关的新增项。选择之后材质编辑器的最终输出节点会出现 Substrate 风格的 BSDF 输入。5.2 构建漫反射分级层卡通渲染的核心是漫反射分级。我们使用一个简单公式用 NdotL 作为输入经过 Step 节点将连续的亮度值切成两段。操作上的核心思路如下用 VertexNormalWS 节点和光照方向做点积用 Saturate 把结果限制在 0 到 1使用 Step 或比较节点把亮度切出硬边用 Lerp 在暗部颜色和亮部颜色之间选择。最终输出连接到 Substrate 基础层的漫反射或 BaseColor 相关入口。这一步在普通材质里也能做到但 Substrate 的优势是它能把这个分级结果当成一个 BSDF 层后面还可以继续叠加其他层。下面给出一个示意性的 HLSL 逻辑帮助你理解幕后发生什么// 示意代码卡通漫反射分级 float NdotL saturate(dot(N, L)); float toonStep step(0.3, NdotL); float3 toonColor lerp(DarkColor, BrightColor, toonStep); // 在 Substrate 中这个结果会作为漫反射 BSDF 的输入这段代码不需要你手动放入引擎源码它在 Substrate 中是通过材质节点编译出来的。5.3 增加高光层卡通头发或金属道具通常需要一块锐利的高光。在传统 Shading Model 中高光形状由引擎固定的 Specular 公式决定在 Substrate 中你可以把高光层当作一个独立的 BSDF 层叠加到漫反射层上。操作上生成一个高光强度值然后用 Power 节点压窄高光范围输入到 Substrate 基础层的高光相关属性。亮度变化越剧烈高光边缘越锐利。5.4 制作轮廓描边Substrate 本身不解决描边问题描边可以在材质阶段通过 World Position Offset 完成。常见做法是让顶点沿法线方向外扩同时翻转背面或正面剔除形成轮廓边。这一步与是否使用 Substrate 无关属于材质通用技巧。// 示意代码法线外扩描边 float3 outlineOffset PixelNormalWS * OutlineWidth; // 将该值接入材质的 World Position Offset 输入需要强调的是卡通描边和 Substrate 材质是两个独立系统。Substrate 负责物体表面的明暗、高光和分层描边则更多依靠几何处理或后处理。两者可以配合工作但不要误以为开了 Substrate 就会自动出现卡通轮廓。5.5 用命令行批量编译材质验证当材质节点搭建完成后你可以在编辑器中按 CtrlShift. 编译材质。如果需要批量验证项目里所有材质可以使用命令行 DDC 填充的方式UnrealEditor-Cmd.exe YourProject.uproject -runDerivedDataCache -fill这条命令会在命令行模式下构建并缓存材质相关的派生数据。如果材质有问题日志中会直接输出编译错误方便排查。6. 如何判断 Substrate 卡通材质真的生效材质编译通过不等于效果正确。Substrate 材质是否真正生效要分几个层面验证。首先观察基本效果。切换视角移动主光源确认物体漫反射是否出现锐利的亮度切换而不是平滑渐变。如果已经做了描边确认轮廓线是否连续粗细是否均匀。其次打开材质编辑器里的着色器复杂度Shader Complexity视图看一下材质复杂度是否在你预期范围内。Substrate 材质如果组合的层数过多复杂度视图会显示出明显更高的渲染开销。第三使用渲染调试工具。在编辑器控制台执行 Substrate 相关调试命令名称随版本可能变化常以r.Substrate.开头可以把材质内部 BSDF 组合可视化出来。打开后你通常能看到一个或多个基础材质层以及它们之间的混合关系。如果只能看到单独一个全局开关说明 Substrate 组合可能没有真正生效。最后用 ProfileGPU 抓一帧检查该角色的 Draw Pass 数量。Substrate 材质如果由多个 BSDF 层组成有可能会拆成多个 Draw也可能因为 GPU 端的合并优化而合并为一个 Draw。前者意味着性能预算要重新评估后者则是理想状态。判断成功与否的标准很简单效果是否符合预期性能是否在预算内。7. 常见问题与排查方法Substrate 目前仍然属于新系统遇到问题几乎是可以预期的。以下是整理出的几个高频问题和对应的排查思路。问题现象可能原因排查方式解决方案开启 Substrate 后编辑器崩溃RHI 不是 DX12或显卡驱动过旧查看崩溃日志确认 RHI 类型在项目设置中切换 DX12更新显卡驱动材质编辑器找不到 Substrate 节点项目没有启用 Substrate 选项检查 Project Settings 中渲染相关选项启用后重启编辑器材质变成全白或全黑Lumen/全局光照与材质层兼容性出现异常切换光照方案观察变化临时使用 Screen Space GI 或关闭实验性 GI 验证卡通明暗边缘出现噪点阴影贴图分辨率不足或 SSAO 干扰关闭 AO 看结果提高阴影贴图分辨率调整 AO 强度Substrate 材质 DrawCall 翻倍BSDF 组合被拆成多个 Draw用 ProfileGPU 查看实际 Draw 数量评估使用更少的 Slab 层或使用纹理通道合并逻辑命令行编译报错节点连接错误或依赖资源缺失查看 UnrealEditor-Cmd 日志回退最近的材质改动逐节点排查出现问题时第一优先永远是看日志而不是猜。Substrate 材质编译错误一般会输出到 Output Log命令行模式下则是控制台输出。确认错误发生在材质编译阶段还是渲染阶段可以大幅缩小排查范围。8. 最佳实践Substrate 卡通渲染的工程化建议Substrate 自由度很高但自由不等于乱用。实际项目中把它做成可控的资产模板比让每个美术自己自由连节点更稳妥。第一把所有 Substrate 卡通材质的通用部分封装成 Material Function。漫反射分级、高光锐化、描边偏移这些逻辑抽成函数后美术在角色材质里只需要暴露几个参数例如暗部颜色、亮部颜色、切分阈值、描边宽度、高光锐度。这样既能保证多个角色风格统一也能避免复杂的节点树直接散落在每个资产里。第二严格控制材质层数。Substrate 的性能和组合复杂度不是线性关系。一个角色材质如果有三层 Slab 叠加可能还有额外的高光层和描边层那就要在开发早期建立性能预算。在 ProfileGPU 中明确记录每个角色的 Draw 数量和 GPU 耗时基线后续改动只要超过预算就要优化。第三用 Quality Switch 做多级质量方案。近景角色可以使用三层组合远景角色则降级到一层或直接使用传统材质。这既保证了近景表现也可以避免远景角色造成不必要的 GPU 开销。第四版本兼容性提前规划。Substrate 在 UE 5.4 到 5.8 之间变化很快节点名称、内部接口都可能调整。如果项目需要长期维护建议尽量减少自定义引擎源码依赖不要为了某个功能直接把 Substrate 内部类和你的工程代码强耦合。未来升级引擎时资产层面的迁移成本通常小于源码层面的适配成本。第五如果你使用源码版引擎建议把 Substrate 相关改动单独放在 feature 分支避免和主分支渲染改动互相污染。Substrate 还在演进引擎组和 TA 组的协作需要一个明确的集成窗口。第六描边部分不要强行塞进 Substrate 材质。轮廓描边用后处理方案或者单独的描边 Mesh会让调试更清晰。Substrate 专注于材质表面属性描边属于几何后处理两者分开反而更利于性能和迭代。第七给每个 Substrate 材质写文档。自由组合最大的风险是“只有原作者能维护”。把节点的含义、为什么要拆成这几层、每一层在画面中起什么作用记录下来团队其他人接手时才能快速进入状态。9. 总结与后续深入方向UE 5.8 的 Substrate 真正改变的是渲染风格定制的实现位置。以前做卡通渲染很多需求需要改引擎 Shading Model 才能完成现在则可以在材质层用 BSDF 组合实现。这是渲染架构上的一个转变而不是单纯多了一个开关。如果你准备投入到 Substrate 卡通渲染的实际项目中建议按这个路径走先在一个独立的小项目里开启 Substrate搭一个只有三层结构的简单角色材质确认明暗分级、高光和描边可以正确组合然后用 ProfileGPU 记录性能基线最后再逐步丰富效果。不要在第一天就把整个项目的材质全部迁移到 Substrate那样排错成本会非常高。后面的深入方向也很多Substrate 与 Nanite 的兼容性测试、不同光照环境下的卡通材质稳定性、移动端渲染路径的变化、Substrate 材质与 Custom Depth/后处理的交互轨迹都值得持续关注。你真正能从这篇文章带走的是这套从“改引擎”到“拖节点”的思维转换以及一套可复用的调试和工程化方法。建议收藏备用回头实际项目接入时再拿出来对照验证。