DreamShaderLang
HLSL / GLSL 背景

关键字速查

DreamShaderLang 语法特殊对待的每一个词,以及供移植代码时对照的 HLSL 与 GLSL 词汇表。

一张查阅用的页面。DreamShaderLang 的几张表是穷尽的:块关键字、section 名、限定符、上下文关键字和 保留名就是语法认得的全部集合。HLSL 和 GLSL 两张表是给从那两门语言过来的读者做参考的。

没有任何关键字对标识符是保留的。 property、输出变量、参数或函数都可以叫 ShaderGraphLayoutfloat;解析器从不会因为一个标识符和关键字撞名就拒绝它。关键字只在语法期待它们的位置 才被识别。

例外根本不是关键字 —— 是数学内置和构造器的名字,它们在 Graph 块的名称 解析中胜出,会静默遮蔽用户声明。

顶层块关键字

区分大小写,且只在下一个字符不是字母、数字或 _ 时才匹配 —— 正是这条边界规则让 ShaderFunction 不会被当成 Shader

关键字头部必填生成
ShaderShader(Name = "…"[, Root = "…"])NameUMaterial
ShaderFunctionShaderFunction(Name = "…"[, Root = "…"])NameUMaterialFunction
ShaderLayer since 1.3.0ShaderLayer(Name = "…"[, Root = "…"])NameUMaterialFunctionMaterialLayer
ShaderLayerBlend since 1.3.0ShaderLayerBlend(Name = "…"[, Root = "…"])NameUMaterialFunctionMaterialLayerBlend
MaterialLayer(1.3.0 起弃用)MaterialLayer(Name = "…")NameShaderLayer
MaterialLayerBlend(1.3.0 起弃用)MaterialLayerBlend(Name = "…")NameShaderLayerBlend
VirtualFunction since 1.2.0VirtualFunction(Name = "…"[, Asset = "…"])Name,外加来自 Asset =Options.Asset 的资产不生成 —— 声明一个已有资产
NamespaceNamespace(Name = "…")Name不生成 —— helper 的作用域
FunctionFunction [SelfContained | Inline] [<ret>] <Name>( … ) { <HLSL> }一个名字,至少一个输出一个 HLSL helper
GraphFunction since 1.3.1GraphFunction [<ret>] <Name>( … ) { <HLSL> }一个名字,至少一个输出带节点输入的 HLSL helper

Shader 在整个翻译单元(即整个 import 闭包)中只能有一个。其余每种块都可以重复。 FunctionGraphFunction 还可以嵌在 Namespace 里,此时它们的名字变成 <Namespace>::<Name>

已弃用 1.3.0

请改用 ShaderLayer

MaterialLayerMaterialLayerBlend 仍然能解析、生成的资产也相同,但各自会发出 MaterialLayer is deprecated; use ShaderLayer instead. / MaterialLayerBlend is deprecated; use ShaderLayerBlend instead. 之后的诊断都报现代写法。

Section 名

不区分大小写。块前的 = 可省 since 1.5.0,块后的 ; 也可省。section 顺序任意,可以重复。

名称可用于含义
PropertiesShaderShaderFunctionShaderLayerShaderLayerBlend参数、constUE.* 节点声明
PropertiesVirtualFunctionInputs 的别名 —— 是有类型的参数,不是参数节点
InputsShaderFunctionShaderLayerShaderLayerBlendVirtualFunction有类型的输入参数
OutputsShaderFunctionShaderLayerShaderLayerBlendVirtualFunction有类型的输出参数
OutputsShader输出声明与绑定 —— 另一套语法
ResultsShaderFunctionShaderLayerShaderLayerBlendVirtualFunctionOutputs 的别名
SettingsShader材质设置 —— 特殊键加上反射到 UMaterial 的属性
SettingsShaderFunctionShaderLayerShaderLayerBlend材质函数的四个键
SettingsVirtualFunctionOptions 的别名
OptionsVirtualFunction声明的资产及其他存储键
GraphShaderShaderFunctionShaderLayerShaderLayerBlend节点图主体,原样存储
Code到处都被拒绝;请用 Graph
LayoutShaderShaderFunctionShaderLayerShaderLayerBlendNode / Comment 摆放;第二个 Layout替换第一个

FunctionGraphFunction 完全没有 section —— 它们的 { … } 是裸 HLSL。

声明限定符

限定符位置效果
const since 1.2.6Properties 声明中类型之前产出常量节点而不是参数;在参数节点和 UE.* 声明上被拒绝
opt since 1.2.3Inputs 声明中类型之前在 Unreal 里把该函数输入标记为可选;后面必须跟一个字面空格
inFunction / GraphFunction 参数类型之前输入参数;参数只有两个 token 时的默认值
outFunction / GraphFunction 参数类型之前输出参数;除非声明了返回类型,否则至少要有一个
SelfContainedFunction 之后把函数体自包含地嵌进每个调用方的 Custom 节点;不接受用在 GraphFunction
InlineFunction 之后SelfContained 的完全别名

函数参数上只接受 inout 两个限定符。inout 不存在,会被拒绝。

上下文关键字

只在列出的位置被识别,且总是不区分大小写。

关键字位置含义
import源文件任意位置,独占一行的第一个 token内联另一个源文件
Group("…") { … } since 1.5.0Properties 内的语句位置把参数组名盖到内部每条声明上;可嵌套,用 | 拼接
Slider(min, max) since 1.5.0[ … ] 元数据块内的条目设置标量参数的 UI 范围
Path( … )纹理或资产型声明的默认值带根写法的资产引用
Base.Outputs 绑定目标的开头绑定到一个材质属性
Expression( … )Outputs 绑定目标的开头绑定到反射节点上的某个 pin;Class="…" 必填
.Pin[<index>]Expression( … ) 目标之后选择要绑定的 pin
Node( … )Layout 内的语句钉住某个变量的节点位置
Comment( … )Layout 内的语句放置一个注释框
#Region / #EndRegionGraph 体内独占一行给图的一段命名;可嵌套
UE.Properties 的类型位置、Graph 的调用位置内置材质节点命名空间
Substrate.Graph 的调用位置Substrate BSDF 命名空间,since UE 5.4
true / false默认值布尔字面量;期待标量的位置会转成 1.0 / 0.0
default since 1.2.3Graph 中的调用实参使用该参数声明的默认值

保留名

名称位置规则
__returnFunction / GraphFunction 参数名为返回类型降级保留;声明的返回类型会变成叫这个名字的 out 参数
returnShaderOutputs 声明不能用作输出变量名;作为绑定源时只能喂给 Base.* 目标

Function 体里的 return 是语句,不是保留名:顶层的 return <expr>; 会被改写成对 __return 的赋值。

类型 token

完整集合共 44 个 token,在每个上下文中都不区分大小写匹配。逐上下文的有效性见 类型与值

Token个数
标量(1 分量)float float1 half half1 int uint bool7
向量(2 / 3 / 4 分量)float2..4 half2..4 vec2..4 int2..4 uint2..4 bool2..4 ivec2..4 uvec2..4 bvec2..427
纹理Texture2D TextureCube Texture2DArray Texture3D VolumeTexture5
不透明及其他SamplerState MaterialAttributes Substrate StaticBool StaticBoolParameter5

没有矩阵类型mat2 / mat3 / mat4float2x2 / float3x3 / float4x4 在每个声明位置 都被拒绝。有三个 token 已被移除,现在会落到各自上下文通用的"不支持的类型"诊断上:

已移除的 token替代
Scalarfloat
Colorfloat4 / vec4
Vectorfloat2float4 / vec2vec4

Properties 声明还可以使用 22 个显式 *Parameter 节点 token(ScalarParameterTextureSampleParameter2DChannelMaskParameter …)。它们收录在 Properties 类型

标识符改写

只在 FunctionGraphFunction 声明内部、输出 HLSL 之前应用。匹配不区分大小写、按整标识符进行; 字符串和注释被跳过,:: 限定名绕过该表。

写的改写为作用于
vec2 vec3 vec4float2 float3 float4参数与返回类型、函数体文本
ivec2 ivec3 ivec4int2 int3 int4参数与返回类型、函数体文本
uvec2 uvec3 uvec4uint2 uint3 uint4参数与返回类型、函数体文本
bvec2 bvec3 bvec4bool2 bool3 bool4参数与返回类型、函数体文本
mat2 mat3 mat4float2x2 float3x3 float4x4参数与返回类型、函数体文本
mixlerp仅函数体文本
fractfrac仅函数体文本
modfmod仅函数体文本

HLSL 关键字

参考 —— HLSL 自己的词汇,在 Function 体里有效。

分类关键字
类型voidboolintuinthalffloatdouble
控制流ifelseforwhiledoswitchcasedefault
跳转returnbreakcontinuediscard
参数inoutinout
修饰conststaticuniformgroupshared
纹理Texture2DTextureCubeSamplerStateSamplerComparisonState
聚合struct

GLSL 关键字

参考 —— 除 vec* / ivec* / uvec* / bvec* 类型别名(它们是一等 token)之外, 这里的内容都不属于 DreamShaderLang 语法。

分类关键字
类型voidboolintuintfloatdoublevec2vec3vec4mat2mat3mat4
控制流ifelseforwhiledoswitchcasedefault
跳转returnbreakcontinuediscard
参数inoutinout
修饰constuniformlayoutcentroidflatsmoothattributevarying
精度lowpmediumphighp

迁移提醒

原本的习惯在 DreamShaderLang 中
vec3继续写 —— vec3 是真正的 token;只有在生成 HLSL 时才变成 float3
mix(a, b, t)两处都能用:在 Graph 里是真正的内置,在 Function 体里被改写成 lerp
fract(x)mod(a, b)同上 —— 在 Graph 里是真正的内置 since 1.5.0,在函数体里被改写
length(v)不是内置 —— 写 sqrt(dot(v, v))、走 UE.Expression(Class = …),或写进 Function
main()不需要;用带 Outputs 绑定的 Shader 块描述材质
uniform写成 Properties 声明
sampler2D + texture(s, uv)纹理对象用 SampleTexture2D(tex, uv)TextureSampleParameter*Tex(Coordinates = uv)
HLSL Custom 节点函数体Function;函数体需要 UE.* 值时用 GraphFunction
可视化材质节点用具体的 UE.* 内置,或 UE.Expression(Class = "…")
共享 include 文件.dsh 头文件加 import

接下来

本页目录