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. 如果属性是 FExpressionInput 或 FMaterialAttributesInput,参数成为连线输入,其值作为表达式求值; 否则作为字面量属性写入。
  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>UMaterialExpression 类Substrate 输出
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", …)

    类名解析接受 SubstrateToonBSDF、MaterialExpressionSubstrateToonBSDF 和完整的 /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),每个名字一条,含 qualifiedName、className、outputType、isSubstrateOutput 和精选的 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

接下来

本页目录