DreamShaderLang
内置节点

Substrate 节点

Substrate.* 调用命名空间 —— 24 个包装 Unreal Substrate BSDF、组合与工具节点的入口。需要 UE 5.4+。

Substrate.* 是与 UE.* 并列的调用命名空间,用来包装 Unreal 的 Substrate BSDF、组合和工具材质节点。每个名字对应一个固定的表达式类 —— 24 个名字解析到 22 个不同的类, 因为其中有两对别名。

Outputs = {
    Substrate Surface;
    Base.FrontMaterial = Surface;
}
Graph = {
    Surface = Substrate.Unlit(EmissiveColor = Glow);
}

可用性

since UE 5.4

Substrate.* 需要 Unreal Engine 5.4 或更新版本,并且项目中启用了 Substrate。 这是两个独立的条件, 而 DreamShader 只检查第一个。

整个命名空间 —— 描述符表、类检查和 Substrate 类型 token —— 只在 UE 5.4+ 上编译进来。在 UE 5.3 上 每个调用都会失败:Substrate builtin call '{Name}' requires Unreal Engine 5.4 or newer.

DreamShader 读取 Project Settings ▸ Engine ▸ Rendering ▸ Substrate。在没有启用 Substrate 的项目里, 一个会生成 Substrate 图的源文件仍会把资产建出来,然后在 Unreal 自己的材质翻译阶段失败, 而那条错误不会提到 DreamShader。

所有受引擎版本限制的部分:

使用面版本门槛低于门槛时
Substrate.<Name>(…) 调用UE 5.4Substrate builtin call '{Name}' requires Unreal Engine 5.4 or newer.
Substrate 声明类型 tokenUE 5.4token 解析不了
通用 UE.* 调用上的 OutputType="Substrate"UE 5.4UE.{Name} OutputType="Substrate" requires Unreal Engine 5.4 or newer.
Base.FrontMaterial 输出绑定UE 5.4Base.FrontMaterial requires Unreal Engine 5.4 or newer.
Settings = { ShadingModel = "Substrate"; } 以及 "Strata" 写法UE 5.4ShadingModel="Substrate" requires Unreal Engine 5.4 or newer.

编辑器工具链遵循同一个门槛。在 UE 5.3 上清单文件 Saved/DreamShader/Bridge/substrate-builtins.json 会被写成空条目数组、supported: false,以及 unsupportedReason: "Substrate builtins require Unreal Engine 5.4 or newer." —— 所以编辑器扩展的补全里什么都不会有。参见编辑器工具

语法概要

记号含义示例
<x>占位符——替换成实际内容,尖括号本身不写出来。Name = <string>
[ x ]可选——整段可以整体省略。[, Root = <string>]
{ a | b }多选一——从竖线分隔的写法里取其中一个。{ Node( … ) | Comment( … ) }
可重复——前一项可以出现任意多次。<property-declaration> …
Substrate . <Name> ( [ <argument-name> = <expression> ]
                     [ , <argument-name> = <expression> ] …
                     [ , { Output | OutputName } = "<pin-name>" ]
                     [ , OutputIndex = <integer> ] )

命名空间前缀和名字都不区分大小写SUBSTRATE.UNLIT(…) 能解析。参数名会去掉首尾空白并按不区分 大小写比较,但除此之外必须精确匹配 —— 不会去掉分隔符。

参数模型

每个 Substrate.* 调用都走通用反射路径,因此继承 UE.Expression 的规则。

规则行为
所有参数都必须命名位置参数会失败:Generic Substrate.{Name} calls require named arguments.
拒绝 Class=Substrate.{Name} uses a fixed MaterialExpression class and does not accept Class. —— 类来自描述符,不可覆盖
忽略 OutputType= / ResultType=输出类型由描述符合成;写了也不起作用,也不报错
Output= / OutputName=按名字选择输出 pin
OutputIndex=按 0 起始的索引选择输出 pin
两个选择器同时出现UE.{Name} cannot use OutputName/Output together with OutputIndex.
其他参数由反射分派,见下

由反射驱动的绑定

参数绑定不是查表的。对每个剩余参数,生成器按顺序尝试:

  1. 输入 pin 名 —— 节点报告的每个输入 pin,去空白后不区分大小写比较。
  2. UPROPERTY —— 该类或父类上的任意反射属性,比较方式相同。布尔属性还额外支持去掉开头的 b 后匹配。
  3. 如果属性是 FExpressionInputFMaterialAttributesInput,参数成为连线输入,其值作为表达式求值; 否则作为字面量属性写入。
  4. 都不匹配 → UE.{Name}: '{Argument}' is not a property on '{Class}'.

同名时 pin 名匹配优先于反射属性。

名字里带空格的引擎 pin 无法触达。 参数名归一化只做去空白和转小写,不会去掉中间的空格, 所以显示为 Diffuse Albedo 的 pin 无法写成参数名。改用 UPROPERTY 名 —— DiffuseAlbedo —— 也就是下面各表列出的名字。pin 名和属性名一致时,两种写法都可以。

可接受的参数名跟随引擎,而不是插件。 步骤 1 和 2 查询的是运行时的 UMaterialExpressionSubstrate* 类,因此精确的可接受集合就是当前引擎版本暴露出来的那些; 引擎版本增删了某个输入,它就会随之出现或消失,插件不需要改动。

下面各表列出这些类暴露的输入。补全列标记的是 DreamShader 发布到编辑器补全和 Bridge 清单里的 精选子集,那个子集由插件固定的。同一个类上任何非输入的反射属性 —— 枚举、浮点、布尔 —— 即使这里没有列出,也同样可以作为字面量参数设置。

选择输出

Output= / OutputName= 按输出 pin 的名字原样比较,不区分大小写,包括含空格的名字 —— 输出 pin 名是作为整体名字匹配的,不会当成参数名解析。OutputIndex= 取 0 起始的索引。 只有四个工具节点有多个输出。

目录

Substrate 输出标记那些结果是 Substrate 材质值的包装节点 —— 0 分量,可绑定到 Base.FrontMaterial。 标为的四个是工具节点,返回普通数值。

Substrate.<Name>UMaterialExpressionSubstrate 输出
ShadingModelsUMaterialExpressionSubstrateShadingModels
SlabUMaterialExpressionSubstrateSlabBSDF
SimpleClearCoatUMaterialExpressionSubstrateSimpleClearCoatBSDF
VolumetricFogCloudUMaterialExpressionSubstrateVolumetricFogCloudBSDF
UnlitUMaterialExpressionSubstrateUnlitBSDF
HairUMaterialExpressionSubstrateHairBSDF
EyeUMaterialExpressionSubstrateEyeBSDF
SingleLayerWaterUMaterialExpressionSubstrateSingleLayerWaterBSDF
LightFunctionUMaterialExpressionSubstrateLightFunction
PostProcessUMaterialExpressionSubstratePostProcess
UIUMaterialExpressionSubstrateUI
ConvertMaterialAttributesUMaterialExpressionSubstrateConvertMaterialAttributes
ConvertToDecalUMaterialExpressionSubstrateConvertToDecal
HorizontalMixUMaterialExpressionSubstrateHorizontalMixing
HorizontalMixing —— HorizontalMix 的别名UMaterialExpressionSubstrateHorizontalMixing
VerticalLayerUMaterialExpressionSubstrateVerticalLayering
VerticalLayering —— VerticalLayer 的别名UMaterialExpressionSubstrateVerticalLayering
AddUMaterialExpressionSubstrateAdd
WeightUMaterialExpressionSubstrateWeight
SelectUMaterialExpressionSubstrateSelect
TransmittanceToMFPUMaterialExpressionSubstrateTransmittanceToMFP
MetalnessToDiffuseAlbedoF0UMaterialExpressionSubstrateMetalnessToDiffuseAlbedoF0
HazinessToSecondaryRoughnessUMaterialExpressionSubstrateHazinessToSecondaryRoughness
ThinFilmUMaterialExpressionSubstrateThinFilm

两对别名是完全的重复 —— 同一个类、同样的输入、同样的输出类型。两种写法都没有被弃用。

输出类型

描述符声明的输出类型分量数标记
Substrate 输出Substrate0Substrate 值,权威
工具节点auto取自所选 pin 的真实值类型数值

随后会用所选输出 pin 的真实值类型检查声明的类型。如果一个声明为 Substrate 输出的包装节点解析到的 pin 不是 Substrate 值,调用会失败:Substrate.{Name} output is not a Substrate value.

Substrate 值只能:

  • 赋给 Substrate 类型的 Graph 变量或 Outputs 声明;
  • 传给另一个 Substrate.* 包装节点的 Substrate 类型输入;
  • 绑定到 Base.FrontMaterial

Substrate 值不能 swizzle,不能用于 + - * /Arithmetic operators cannot be applied to Substrate values.),不能传给 数学内置Math function '{Name}' only accepts numeric scalar/vector arguments.),不能被 StaticSwitchParameter 切换(StaticSwitchParameter '{Name}' cannot switch Substrate values.), 也不能由 HLSL Custom 节点产生。

节点参考

BSDF

Substrate.Slab

通用的 Substrate BSDF slab —— 通常从它开始。

参数值类型补全
DiffuseAlbedo数值
F0数值
F90数值
Roughness数值
Anisotropy数值
Normal数值
Tangent数值
SSSMFP数值
SSSMFPScale数值
SSSPhaseAnisotropy数值
EmissiveColor数值
SecondRoughness数值
SecondRoughnessWeight数值
FuzzRoughness数值
FuzzAmount数值
FuzzColor数值
GlintValue数值
GlintUV数值

Substrate.SimpleClearCoat

带固定第二层 clear coat 波瓣的 slab。

参数值类型补全
DiffuseAlbedo数值
F0数值
Roughness数值
ClearCoatCoverage数值
ClearCoatRoughness数值
Normal数值
EmissiveColor数值
BottomNormal数值

Substrate.Unlit

只有自发光的 BSDF。最小的完整 Substrate 表面。

参数值类型补全
EmissiveColor数值
TransmittanceColor数值
Normal数值

Substrate.Hair

参数值类型补全
BaseColor数值
Scatter数值
Specular数值
Roughness数值
Backlit数值
Tangent数值
EmissiveColor数值

Substrate.Eye

参数值类型补全
DiffuseColor数值
Roughness数值
CorneaNormal数值
IrisNormal数值
IrisPlaneNormal数值
IrisMask数值
IrisDistance数值
EmissiveColor数值

Substrate.SingleLayerWater

参数值类型补全
BaseColor数值
Metallic数值
Specular数值
Roughness数值
Normal数值
EmissiveColor数值
TopMaterialOpacity数值
WaterAlbedo数值
WaterExtinction数值
WaterPhaseG数值
ColorScaleBehindWater数值

Substrate.VolumetricFogCloud

用于体积雾和云材质的参与介质 BSDF。

参数值类型补全
Albedo数值
Extinction数值
EmissiveColor数值
AmbientOcclusion数值

Substrate.ShadingModels

用 Substrate 材质表达的传统着色模型表面。编辑器补全不为这个包装节点提供任何参数;下面所有参数仍然可用。

参数值类型补全
BaseColor数值
Metallic数值
Specular数值
Roughness数值
Anisotropy数值
EmissiveColor数值
Normal数值
Tangent数值
SubSurfaceColor数值
ClearCoat数值
ClearCoatRoughness数值
Opacity数值
TransmittanceColor数值
WaterScatteringCoefficients数值
WaterAbsorptionCoefficients数值
WaterPhaseG数值
ColorScaleBehindWater数值
ClearCoatNormal数值
CustomTangent数值
ThinTranslucentSurfaceCoverage数值

域输出节点

Substrate.LightFunction

参数值类型补全
Color数值

Substrate.PostProcess

参数值类型补全
Color数值
Opacity数值

Substrate.UI

参数值类型补全
Color数值
Opacity数值

转换

Substrate.ConvertMaterialAttributes

MaterialAttributes 值转换成 Substrate 材质。

参数值类型补全
MaterialAttributesMaterialAttributes
Attributes —— MaterialAttributes 的别名MaterialAttributes
WaterScatteringCoefficients数值
WaterAbsorptionCoefficients数值
WaterPhaseG数值
ColorScaleBehindWater数值

MaterialAttributes 是反射属性名,Attributes 是引擎给同一个输入起的 pin 名;两者都绑定 input 0。 传数值进去会失败: Substrate.ConvertMaterialAttributes input '{Pin}' expects a MaterialAttributes value.

Substrate.ConvertToDecal

把 Substrate 材质转换成贴花材质。

参数值类型补全
DecalMaterialSubstrate
Coverage数值

组合

Substrate.HorizontalMix

在屏幕空间水平混合两个 Substrate 材质。也可以写成 Substrate.HorizontalMixing —— 两个名字可以互换。

参数值类型补全
BackgroundSubstrate
ForegroundSubstrate
Mix数值

Substrate.VerticalLayer

把一个 Substrate 材质叠在另一个之上。也可以写成 Substrate.VerticalLayering —— 两个名字可以互换。

参数值类型补全
TopSubstrate
BaseSubstrate
Thickness数值

Substrate.Add

参数值类型补全
ASubstrate
BSubstrate

Substrate.Weight

缩放一个 Substrate 材质的贡献。

参数值类型补全
ASubstrate
Weight数值

Substrate.Select

在两个 Substrate 材质之间做静态选择。

参数值类型补全
ASubstrate
BSubstrate
SelectValue数值

工具节点

这四个返回普通数值而不是 Substrate 值,也是唯一有多个输出的包装节点。用 Output=OutputIndex= 选择。

Substrate.TransmittanceToMFP

把透射颜色和厚度转换成平均自由程参数化。

参数值类型补全
TransmittanceColor数值
Thickness数值
输出索引名字
0(默认)MFP
1Thickness

Substrate.MetalnessToDiffuseAlbedoF0

把传统的 base color / metallic / specular 三元组转换成 slab 参数化。

参数值类型补全
BaseColor数值
Metallic数值
Specular数值
输出索引名字
0(默认)DiffuseAlbedo
1F0

Substrate.HazinessToSecondaryRoughness

把 haziness 控制量转换成第二粗糙度波瓣。

参数值类型补全
BaseRoughness数值
Haziness数值
输出索引名字
0(默认)Second Roughness
1Second Roughness Weight

注意这些输出名里带空格。它们是作为整体名字匹配的,所以 Output = "Second Roughness Weight" 可用 —— 尽管带空格的 pin 名作为参数名是无法触达的。

Substrate.ThinFilm

计算薄膜干涉的高光颜色。

参数值类型补全
Normal数值
F0数值
F90数值
Thickness数值
IOR数值
输出索引名字
0(默认)Specular Color
1Edge Specular Color

绑定到 Base.FrontMaterial

Substrate 材质只能通过 Base.FrontMaterial 输出绑定进入生成的 UMaterial,没有别的途径。

Outputs = {
    Substrate Surface;              // 声明类型 token;不区分大小写,没有别的写法
    Base.FrontMaterial = Surface;
}
Graph = {
    Surface = Substrate.Unlit(EmissiveColor = Color);
}
规则行为
声明类型 token只有 Substrate 一种写法,会去掉空白且不区分大小写。Strata 不是类型 token
着色模型这个绑定会强制把材质的着色模型设为 Substrate —— 不需要写 Settings
显式 ShadingModel 设置只允许 "Substrate""Strata";其他值都会失败
同一个 Shader 中的 Base.MaterialAttributes拒绝 —— 两个绑定互斥
Backend需要 Graph 块;HLSL Custom 节点无法产生或驱动 Substrate 值
引擎版本UE 5.4+

Strata 是改名前的写法。它作为 Settings = { ShadingModel = … } 的值是可接受的 —— 同一个着色模型的别名 —— 但永远不能作为类型 token,也不能作为调用命名空间。参见 枚举取值

一些值得知道的细节

  • 并非每个 Substrate 类都有包装节点。 UMaterialExpressionSubstrateToonBSDF 在目录里没有条目。 要用它 —— 以及将来任何新的 Substrate 类 —— 走通用路径:

    UE.Expression(Class = "SubstrateToonBSDF", OutputType = "Substrate", …)

    类名解析接受 SubstrateToonBSDFMaterialExpressionSubstrateToonBSDF 和完整的 /Script/Engine.… object path,三者等价。带 U 前缀的 C++ 写法不被接受 —— 参见 类解析

  • 已注册的 UE.* 语法糖在这个命名空间里不适用。 没有 Substrate.TexCoord(…) 这种东西; 未知名字会失败于 Unsupported Substrate builtin call '{Name}' in Graph.

  • Substrate 节点参与节点复用:两个文本相同、参数值也相同的 Substrate.Slab(…) 调用会合并成 一个节点。这和通用 UE.Expression 路径用的是同一套缓存, 也正因如此,一个多输出的工具节点可以用不同的 Output= 选择器服务两次读取。

  • 反编译器可以把已有的 Substrate 图导回 DreamShaderLang, 并从每条连接的写掩码推导通道 swizzle since 1.5.0

  • 完整的 Substrate.* 使用面会导出给编辑器工具链,写入 Saved/DreamShader/Bridge/substrate-builtins.json(schema DreamShader.SubstrateBuiltins, version 1),每个名字一条,含 qualifiedNameclassNameoutputTypeisSubstrateOutput 和精选的 parameters。参见编辑器工具

诊断

下面有几条消息即使是 Substrate.* 调用也以字面文本 UE. 开头。它们来自共享的通用内置路径, 那条路径无条件把前缀格式化为 UE.;只有显式携带命名空间的消息才会渲染成 Substrate.。 这只是显示问题 —— 消息里的 {Name} 仍然是 Substrate 包装节点的名字。

调用点

消息触发原因处理
Substrate builtin call '{Name}' requires Unreal Engine 5.4 or newer.在 UE 5.3 上做了任何 Substrate.* 调用。低于 UE 5.4 无法使用 Substrate,请改用传统着色模型。
Unsupported Substrate builtin call '{Name}' in Graph.该名字不在目录的 24 个之列。检查拼写,或用 UE.Expression 加 OutputType="Substrate" 触达该类。 详解
Generic Substrate.{Name} calls require named arguments.出现了位置参数。所有参数都写名字。
Substrate.{Name} uses a fixed MaterialExpression class and does not accept Class.写了 Class=。类来自描述符。
UE.{Name}: '{Argument}' is not a property on '{Class}'.参数既匹配不上 pin 名也匹配不上反射属性。带空格的 pin 名无法触达 —— 改用 UPROPERTY 名,例如 DiffuseAlbedo。
Substrate.{Name} input '{Pin}' expects a Substrate value.Substrate 类型的 pin 收到了数值。
Substrate.{Name} input '{Pin}' does not accept Substrate values.数值 pin 收到了 Substrate 值。
Substrate.{Name} input '{Pin}' expects a MaterialAttributes value.MaterialAttributes 类型的 pin 收到了别的东西 —— 通常是 Substrate.ConvertMaterialAttributes。
Substrate.{Name} output is not a Substrate value.描述符声明为 Substrate 输出,但所选 pin 的值类型不是 Substrate。
UE.{Name} output '{Pin}' was not found on '{Class}'.指定名字的输出 pin 不存在。工具节点的输出名可能带空格,例如 "Second Roughness Weight"。
UE.{Name} OutputIndex is out of range for '{Class}'.索引为负,或超出最后一个输出。
UE.{Name} could not resolve MaterialExpression class '{Class}'.描述符指定的类在当前引擎中不存在。

管线其他环节中的 Substrate 值

消息触发原因处理
Arithmetic operators cannot be applied to Substrate values.Substrate 值被用于 + - * /。用 Substrate.Add、Substrate.Weight 或 Substrate.VerticalLayer 组合 Substrate 值。
Math function '{Name}' only accepts numeric scalar/vector arguments.Substrate 值被传给了数学内置。详解
StaticSwitchParameter '{Name}' cannot switch Substrate values.True= / False= 分支上出现了 Substrate 值。改用 Substrate.Select。
Graph variable '{Name}' uses Substrate, which requires Unreal Engine 5.4 or newer.在 UE 5.3 上声明了 Substrate 类型的 Graph 变量。
Base.FrontMaterial requires Unreal Engine 5.4 or newer.在 UE 5.3 上使用了这个绑定目标。
{File}: Base.FrontMaterial requires ShadingModel="Substrate" or no explicit ShadingModel setting.显式着色模型与之冲突。删掉 ShadingModel 设置,或设为 Substrate / Strata。 详解
{File}: Base.FrontMaterial and Base.MaterialAttributes cannot be used by the same Shader.两个绑定同时存在。它们互斥。
{File}: Base.FrontMaterial expects a Substrate value and cannot be driven by a material Custom node. Use a Graph block and Substrate.* nodes.绑定的来源是 HLSL Custom 节点。
{File}: Material output '{Output}' expects a numeric value, but got Substrate.Substrate 值被绑定到了数值类型的材质输出。
DreamShader Function '{Name}' result '{Result}' uses Substrate, which is not supported by HLSL Custom node functions. Use GraphFunction or ShaderFunction instead.Function 声明了 Substrate 结果。详解
ShadingModel="Substrate" requires Unreal Engine 5.4 or newer.在 UE 5.3 上写了 Settings = { ShadingModel = "Substrate"; } 或 "Strata"。

完整清单见错误速查

示例

Shader(Name="Docs/M_Substrate")
{
    Properties = {
        vec3  BaseColor = vec3(0.6, 0.1, 0.1);
        float Metallic  = 0.0;
        float Specular  = 0.5;
        float Rough     = 0.3;
        vec3  Glow      = vec3(0.1, 0.6, 1.0);
    }

    Outputs = {
        Substrate Surface;
        Base.FrontMaterial = Surface;
    }

    Graph = {
        // 工具节点:两个数值输出,按名字选择。
        vec3 Albedo = Substrate.MetalnessToDiffuseAlbedoF0(
            BaseColor = BaseColor, Metallic = Metallic, Specular = Specular,
            Output = "DiffuseAlbedo");
        vec3 F0 = Substrate.MetalnessToDiffuseAlbedoF0(
            BaseColor = BaseColor, Metallic = Metallic, Specular = Specular,
            Output = "F0");

        Substrate Body = Substrate.Slab(
            DiffuseAlbedo = Albedo,
            F0            = F0,
            Roughness     = Rough);

        Substrate Emissive = Substrate.Unlit(EmissiveColor = Glow);

        Surface = Substrate.Add(A = Body, B = Emissive);
    }
}

生成的节点:

SubstrateMetalnessToDiffuseAlbedoF0   -> output "DiffuseAlbedo"  -> Albedo    (3 components)
                                      -> output "F0"             -> F0        (3 components)
                                         (one node, reused for both reads)
SubstrateSlabBSDF                     -> Body                    (Substrate value)
SubstrateUnlitBSDF                    -> Emissive                (Substrate value)
SubstrateAdd                          -> Surface                 (Substrate value)
Material ShadingModel forced to Substrate by the Base.FrontMaterial binding

接下来

本页目录