虚幻引擎 5.8 的渲染架构方向里,Substrate 是一个绕不开的关键字。它不再像传统材质那样把着色模型做成一个个“预设挡位”,而是把材质拆成更细的 BSDF 块,用图层和运算符自由组合。这在卡通渲染、风格化渲染这种“不按物理规律走”的场景里,意义比 PBR 默认流程更大。
这篇文章会直接从 Substrate 的基本设计讲起,拆开卡通渲染需要哪些着色能力,然后给出在 Substrate 下实现卡通漫反射、高光、边缘光、描边的搭建思路,最后补充性能观察和常见坑点。如果你正在做风格化项目,或者准备把手头材质从旧的 Shading Model 体系迁到新架构,可以重点看第 4、5、6 节。
先说结论:Substrate 是实验性架构,UE 5.8 里的具体节点、函数名要以官方发布说明为准;但它的分层组合思想在多个 UE 版本里是延续的,先把概念跑通,迁移成本会低很多。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 架构类型 | 基于 BSDF 图层组合的材质渲染架构 |
| 设计目标 | 取代传统多种 Shading Model 的独立实现,提升材质组合灵活度 |
| 对卡通渲染的意义 | 可用 Layer 组合漫反射色阶、高光、边缘光等子效果 |
| 推荐使用方式 | 材质节点组合为主,自定义 BSDF 需要源码版引擎 |
| 是否支持移动端 | 取决于目标平台对 Substrate 的支持,建议先用 PC 验证 |
| 主要门槛 | 需要掌握 UE 材质编辑器、基础 HLSL |
| 适合读者 | 技术美术、图形程序员、风格化渲染团队 |
| 常见风险 | 实验性功能,节点和接口会随版本变化 |
这张表先帮大家建立基本判断。接下来是适用场景和边界。
2. 适用场景与使用边界
Substrate 最适合的项目类型是“材质逻辑复杂、需要多个层叠加”的渲染任务。卡通渲染是典型场景:一个角色材质通常包含基础漫反射层、高光层、边缘光层、描边层,过去的做法是把这些参数全部塞进一个材质或依赖大量材质节点分支,图层一多,节点的连线复杂度非常高,也容易出现 Switch 分支导致编译变慢。Substrate 的思路是把这些层做成可独立调节的 BSDF 块,再通过运算符组合,逻辑上更清晰。
但 Substrate 不是万能的。如果项目已经在传统材质体系上稳定跑了很久,为了卡通渲染整体迁移到 Substrate 需要评估成本。从材质的节点命名、资源兼容性,到渲染器的编译链路,都会出现变化;在一些定制渲染管线中,兼容风险更高。对移动端和主机端的支持也需要实测,不能只看 PC 编辑器里的表现。
另外要特别提醒一点:无论使用 Substrate 还是传统材质,都要遵守所使用的引擎版本对应的许可协议。角色模型、人物肖像、场景贴图等素材,发布和商用前需要确认授权,这是基本的合规底线。
3. 环境准备与前置条件
在开始搭建 Substrate 卡通材质之前,建议先确认环境满足以下条件:
- 已安装支持 Substrate 的虚幻引擎版本。UE 5.8 是否默认开启 Substrate,需要以官方发行说明为准;如果开启位置有变化,优先查看项目设置里的渲染配置。
- 显卡驱动需要支持项目目标特性级别。建议先用 PC 端验证,确认材质能编译通过,再考虑移动端。
- 有可用的测试工程。工程内容不要太大,方便反复修改材质和查看编译结果。
- 建议准备一个简单的动漫风格角色模型或几何体场景,用于观察光照变化。
Substrate 对新手是否友好?如果只使用材质节点组合,不涉及自定义 BSDF,那么预编译版引擎就可以。自定义 BSDF、修改渲染管线底层逻辑才需要考虑源码版引擎。用源码版引擎时,需要额外安装编译环境:Visual Studio、合适的 .NET SDK、以及引擎源码编译所需的依赖,整个编译过程耗时较长,建议提前规划。
我建议的路线是:先用预编译版引擎跑通材质组合流程,确认 Substrate 能覆盖需求,再评估是否有必要进入源码层改造。
4. Substrate 架构基础:从 Shading Model 到 BSDF 组合
要理解 Substrate 下怎么做卡通渲染,得先放下旧的“Shading Model 下拉框”思维。
传统 UE 材质模型,简单理解就是引擎内置了 Lit、Unlit、Subsurface、Toon 等若干种着色模型,每个模型是一个完整的预置方案。你要在 Lit 之外实现卡通效果,通常要借助 Custom 节点,或者在 Shading Model 里选接近的类型再微调。问题在于:这些着色模型之间的参数不能互通,换一个模型,原本的节点网络可能完全不适用。
Substrate 的设计把材质拆成了更细的单位:
- BSDF:定义表面如何对光线做出响应的函数。
- Slab:一个基础的着色块,包含漫反射、高光、粗糙度等属性,可以当作传统的着色模型看。
- Layer:由多个 Slab 或子 Layer 组成,通过运算符混合,形成更复杂的材质表现。
- Operator:组合用的运算符,例如混合、叠加。
- Closure:最终输出的组合结果。
这个分层设计带来的能力是:同一个材质里,可以同时存在“卡通漫反射层”和“高光层”,两个层的属性独立变化,不会互相覆盖。这正符合卡通渲染多层组合的需求。
对卡通渲染来说,Substrate 的另一个好处是便于做“局部替换”。如果只想让某个部位使用卡通着色,其他部位保持 PBR,可以在 Layer 层面控制权重,而不是在单独着色模型之间来回切换。
5. 卡通渲染在 Substrate 下的技术拆解
卡通渲染的视觉目标通常是:色阶分明、高光硬朗、轮廓清楚。拆成 Shader 层面的需求如下。
5.1 漫反射色阶(Cel Toning)
传统 PBR 漫反射是连续变化的,卡通渲染希望它变成一级一级的色阶。实现思路是拿 NdotL(法线与光方向点积)去映射一个 Ramp 贴图,或者用 smoothstep / floor 切成几段。在 Substrate 中,这一项可以通过自定义漫反射权重或在 BSDF 属性中提供 Ramp 结果来实现。
需要在材质里建立“带梯度的受光范围”。最简单的验证是建一个渐变贴图,用 NdotL 作为 UV 采样它的 U 值,观察受光面和背光面是否出现明显分界线。
5.2 卡通高光
卡通高光一般不需要 PBR 的 GGX 高光路径。常见做法是:用高光项的强度做阈值,大于某个值才输出高光,形成一块平滑的“亮斑”。也可以用噪声贴图做高光边缘的不规则变化。Substrate 下,你可以把高光做成独立 Layer,只在指定区域叠加,避免高光影响漫反射层的色阶。
5.3 边缘光和轮廓(Rim Light & Outline)
边缘光通常用视角方向与法线方向的夹角来控制,夹角大说明表面朝画面外侧倾斜,叠加上边缘光。轮廓线在卡通渲染里经常用“背面放大法”或“后处理描边”。Substrate 本身不负责模型后处理描边,它最适合做的是材质内的边缘光和部分高光表现。
5.4 Ramp 与 LUT 控制
卡通渲染最终风格通常要统一通过 LUT(颜色查找表)或 Ramp 纹理做色调映射。Substrate 材质中可以很方便地把这些纹理作为输入,放进一个可调节的层里,让美术人员随时替换,不需要改动节点结构。
6. Substrate 材质节点组合实践
下面的步骤是以“在材质编辑器中搭建一个卡通材质”为目标,具体节点名可能随 UE 版本变化,但流程思路是通用的。
6.1 启用 Substrate
- 打开项目设置,查找与渲染或材质相关的选项。
- 启用 Substrate 相关开关。如果 UE 5.8 默认开启,跳过这一步。
- 创建一个新的材质,确认其类型或布局是否进入 Substrate 模式。
- 在材质域中选择 Surface,并设置一个简单的测试房间。
6.2 创建基础漫反射 Layer
在材质编辑器中:
- 添加一个“Substrate Slab”或“BSDF”节点,把它作为材质输出链路的根节点。
- 将 Base Color 接到一个 Ramp 色的输出上。Ramp 色用 NdotL 驱动:
- 获取像素法线 Normal Vector。
- 获取光照方向 Light Vector(或者使用光照中的方向性输入)。
- 计算点积,并用 Remap 或 SmoothStep 压成 0~1 的色阶值。
- 把得到的色阶值送给 Base Color 的对应输入。
这里的关键不是节点名字,而是思路:Substrate 的层入参里一定有漫反射核心属性,只需要把“色阶”作为它的输入。
6.3 叠加高光 Layer
继续添加一个高光层,用另一个 Substrate Slab 节点或 BSDF 块,将其权重与基础漫反射层混合:
- 高光层只计算高光强度,使用光滑度、主光方向与视线方向的半程向量。
- 高光输出给高光颜色输入,其他保留默认或设置为零。
- 通过混合权重控制高光强度。典型的卡通效果中,高光区域应当较硬,所以权重曲线需要设置阈值。
6.4 添加边缘光 Layer
边缘光用 Fresnel 节点,边缘值输出到层的自发光或高光通道:
- 添加一个 Fresnel 节点,指数可以设在 2~5。
- 把 Fresnel 输出作为边缘光层的影响因子。
- 与基础漫反射层相加。
6.5 节点组合示例
以下是一个用节点组合抽象描述的流程,代码仅代表连接关系,不代表具体节点名称:
BaseColorLayer = SubstrateSlab(BaseColor = RampFromNdotL, Roughness = 0.1, Specular = 0f) SpecularLayer = SubstrateSlab(BaseColor = 0.0, Specular = StepThreshold, Roughness = 0.05) RimLayer = SubstrateSlab(BaseColor = 0.0, Emissive = Fresnel * RimColor) FinalMaterial = Blend(BaseColorLayer, Add(SpecularLayer, RimLayer))实际搭建时,可以在材质编辑器中通过“追加节点”和“混合节点”连接,一步一个节点验证。
6.6 使用 Ramp 纹理控制色阶
比起手动写阶梯函数,用 Ramp 纹理更可控。美术可以绘制“从暗色到亮色”的渐变图,在材质里采样:
// 概念性代码:在 Custom 节点中计算卡通漫反射 float NdotL = dot(Normal, LightDirection); float rampCoord = NdotL * 0.5 + 0.5; // 映射到 UV float3 toonColor = RampTexture.SampleLevel(RampSampler, float2(rampCoord, 0.5), 0).rgb; return toonColor;这段代码展示的是核心逻辑,在 Substrate 材质里可以作为漫反射颜色的自定义输入。实际使用时,LightDirection 的获取方式取决于材质中的光照节点,RampTexture 需要正确连接到纹理和采样器。
7. 自定义 BSDF 与 Shader 扩展思路
如果节点组合不能满足需求,可以进入自定义 BSDF 阶段。这是相对高阶的用法。
7.1 什么情况下需要自定义 BSDF
当卡通渲染需要非常特殊的漫反射模型,例如“受光面随时间变化”“特殊的多颜色区域风格”时,材质节点组合会显得笨重,这时可以把光照计算函数直接写进 Shader。在 Substrate 体系下,要新增一个 BSDF 类型,通常需要修改引擎源码里的材质和光照代码,并重新编译。这个过程比单纯写材质节点复杂得多,建议只在确实需要时使用。
7.2 概念性的卡通漫反射函数
下面给出一段 HLSL 风格的概念代码,展示卡通漫反射计算的思路:
// 概念示意:并非特定引擎版本的 API float CelDiffuse(float3 N, float3 L, int steps) { float ndotl = saturate(dot(N, L)); float stepValue = floor(ndotl * steps) / (steps - 1); return stepValue; }在 Substrate 的 BSDF 函数里,把这样的返回值作为漫反射 albedo 的调制输入,可以达到色阶效果。
7.3 轮廓线思路
轮廓线如果通过背面放大实现:
// 概念示意:背面膨胀描边 float3 viewNormal = mul((float3x3)ViewMatrix, Normal); float3 stretchedPos = VertexPosition + viewNormal * OutlineWidth; if (IsBackFace) { return float4(OutlineColor, 1.0); }这样的代码通常放在 Material Domain 为 Surface 的材质中,结合双面渲染设置。Substrate 下仍可以在材质内通过 Custom 节点调用,但需要注意是否会影响 BSDF 组合结果。
7.4 源码扩展注意事项
源码版引擎编译时间较长,而且每个版本都可能移动函数位置。最稳妥的做法是:先在社区文档或官方发布说明中查找 Substrate 自定义 BSDF 的标准流程,再动手修改。没有官方文档支撑时,不建议直接改源码,否则升级引擎时需要重新适配所有修改点。
8. 功能验证与效果测试流程
搭建完成后,按下面流程验证效果。
8.1 基础测试
- 放置一个球体或角色模型在场景中。
- 添加一个方向光作为主光源,强度默认即可。
- 移动光源角度,观察受光面与背光面的分界线是否清晰。
- 修改 Ramp 纹理,确认色阶数量变化。
- 打开材质预览窗口,快速比较不同纹理替换后的效果。
判断标准:受光面边缘出现明确色阶,背光面不出现额外噪点,高光区域位置准确。
8.2 多光源测试
- 添加第二个方向光或点光源。
- 观察多个光源同时存在时,漫反射色阶是否会互相干扰。
- 如果两个光源产生不自然叠加,需要在材质中限制主光源的作用范围,或者把卡通漫反射计算逻辑统一到单个光源输出上。
8.3 移动端兼容性初测
如果目标平台是移动端,建议:
- 在项目设置中切换目标平台。
- 编译材质,观察是否有 Substrate 相关报错。
- 在真机上查看显存占用、帧率和发热情况。
- 对比 PC 端效果,确认色阶没有因精度问题丢失。
需要注意:不同平台对 Substrate 的支持有差异,实际性能参数请以真机测试为准。
8.4 输出与调试
调试 Shader 时,推荐使用:
- 材质编辑器的实时预览窗口。
- 场景视图的材质显示模式。
- 渲染调试视图中的着色器复杂度(Shader Complexity)视图。
这些工具能快速定位“某个层是否生效”以及“节点是否符合预期”。
9. 资源占用与性能观察
Substrate 的优势是组合灵活,代价是材质结构可能比传统材质复杂。性能观察要关注以下几点。
9.1 编译时间
多 Layer 组合后,材质编译时间会明显增加。如果一个材质加入三个 Slab,编译器需要处理 BSDF 组合和运算符组合,比传统单 Shading Model 多了一些环节。实际编译时间取决于源工程配置和材质复杂度,建议在编辑器中设置更长的编译超时时间。
9.2 实时性能
在场景中开启 Shader Complexity 视图,观察颜色分布。如果大面积显示为红色,说明材质计算量偏高,需要减少 Layer 数量或优化流程。用 Draw Call 分析工具查看角色材质是否有额外绘制调用。
9.3 显存与内存
Substrate 材质在运行时可能占用更多参数缓冲区和采样器资源,具体数值取决于纹理数量和层数。要观察显存占用,可以用引擎自带的 GPU 分析器(Profiler),记录材质执行时间和采样器使用量。
这里不给出固定显存数字,因为不同显卡、分辨率和 Layer 组合差异很大。以本机测试为依据。
9.4 降低开销的方法
- 把卡通渲染的色阶逻辑集中到一张 Ramp 纹理上,避免多张纹理多次采样。
- 减少 Layer 到三到四层以内,不要无限制叠加。
- 烘焙静态效果:如果模型上某个卡通效果是固定的,可以考虑烘焙成顶点色或贴图,减少实时计算。
- 对不参与光照的纯色块,使用 Unlit 层替代,可以减少光照计算。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Substrate 开关在项目设置中消失 | 版本不支持或插件未启用 | 检查插件管理器和引擎版本 | 确认版本是否支持,或改用支持的 UE 版本 |
| 材质编译时报未知节点 | 节点名随版本变化 | 查看材质编辑器日志和官方文档 | 用新版本节点名替换,或回退到旧版引擎 |
| 多 Layer 混合后颜色发暗 | 混合权重设置错误或 BSDF 属性冲突 | 逐个 Layer 预览 | 检查运算符类型,改成 Add 或合适的混合模式 |
| 卡通漫反射出现噪点 | NdotL 计算精度问题或 Ramp 纹理过小 | 放大 Ramp 纹理,检查采样方式 | 使用纹理过滤或提高 Ramp 分辨率 |
| 边缘光过亮 | Fresnel 指数过低或权重过高 | 调整指数和混合强度 | 把 Fresnel 指数提高到 3~5,降低权重 |
| 自定义 HLSL 无法编译 | 引擎版本 API 变化 | 查看编译错误信息 | 修改为新版函数名,或参考最新文档 |
| 移动端上 Substrate 材质不显示 | 目标平台未启用 Substrate | 检查平台渲染配置 | 使用不被支持的平台兼容层,或回退到传统材质 |
| 升级引擎后节点全部丢失 | 材质数据库迁移问题 | 查看迁移日志 | 手动重建常用材质,或保留旧版引擎项目做对照 |
11. 最佳实践与使用建议
先说一条最重要的:第一次接触 Substrate,不要直接做一个大而全的卡通材质。用一个小球体、一个 Ramp 纹理、一个 Slab 节点跑通流程,确认节点链路清晰后,再逐步加入高光层和边缘光层。
第二,把卡通渲染的关键参数抽出来,用材质参数集(Material Parameter Collection)或实例参数管理。比如 Ramp 纹理的选择、色阶的数量、边缘光颜色和强度、高光阈值等。这样不管是调参还是后续交给美术人员调整,效率都会更高。
第三,目录管理要规范。Ramp 纹理、描边贴图、角色贴图分开存放,命名保持一致性。Substrate 材质结构复杂时,工程文件里的材质命名直接决定团队协作效率。
第四,关于性能预算。在开始制作前,先确认目标平台的性能限制。PC 端可能可以堆 Layer,移动端就要提前精简。所有效果评估都以目标平台上的实际表现为准,不要只在编辑器里看。
第五,合规方面要注意。使用引擎时要遵守对应版本的许可协议;使用的动漫角色贴图、人物模型、美术资产,需要确认来源授权。测试阶段可以使用免费资源或自建模型,避免版权纠纷。
12. 总结与下一步
这次我们重点梳理了 Substrate 架构下实现卡通渲染的思路:不把它当成一个“新的 Shading Model 下拉框”,而是理解成 BSDF 图层组合系统。基于这个基础,先做漫反射色阶,再加高光和边缘光,用 Layer 组合起来,是门槛最低的上手路径。
如果你是第一次接触 Substrate,建议从 UE 5.8 或当前可用的 Substrate 版本开始,新建一个空场景,用球体和 Ramp 纹理做一个最小卡通材质,跑通后再接入真实角色模型。
最容易踩的坑是:把传统材质节点网络的思维直接套用到 Substrate 上,导致 Layer 逻辑混乱、颜色发暗。正确做法是先把每个层的职责想清楚,再组合。
可以继续扩展的方向包括:Substrate 与自定义后处理描边的结合、移动端卡通渲染性能调优、通过源码扩展实现完全风格化的 BSDF、以及在现有 PBR 场景中做局部的卡通风格材质混合。每验证一个方向,记得记录版本号和节点配置,工程升级时能少踩不少坑。