DreamShaderLang
参数

Properties 类型

Properties 声明接受的全部类型 token —— 39 个紧凑 token、22 个参数节点 token,以及它们的默认值与调用形式。

Properties 段里的每一条声明,都会在生成的材质里变成恰好一个节点。生成哪个节点完全由你写的类型 token 决定:token 选定 Unreal 表达式类、决定默认值的写法,并且对少数几种类型来说,还决定这条声明能不能 在 Graph 里被调用以连接输入引脚。

命名类型有两种方式。紧凑 tokenfloatvec3Texture2D)只说明值是什么,由 DreamShader 选节点; 显式 *Parameter tokenTextureSampleParameter2DChannelMaskParameter)直接指定 Unreal 表达式类。 优先用紧凑 token,只有在紧凑集合做不到时才用显式 token。

声明的形状

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

<default-value> 外面和整个元数据块外面的 [ … ] 是表示“可选”的元符号;元数据块自身的方括号是字面标点。 带元数据的声明写作 float A = 1.0 [Group="X"];。元数据语法见 元数据与分组,外层段落语法见 Section

所有类型 token 都大小写不敏感FLOAT3Float3float3 是同一个 token, texturesampleparameter2dTextureSampleParameter2D 也是。

四类 token

类别数量示例生成的节点
紧凑标量7float Strength = 1.0;UMaterialExpressionScalarParameter
紧凑向量27vec3 Tint = vec3(1, 1, 1);UMaterialExpressionVectorParameter
紧凑纹理5Texture2D Base = Path(Game, "T_X");UMaterialExpressionTextureObjectParameter
显式 *Parameter 节点22TextureSampleParameter2D Tex;指定的 UMaterialExpression 子类

还有第五种形式 UE.<Name>( … ) <name>;,把引擎输入节点(UV、时间、顶点色、参数集合读取)声明成属性, 见 UE.* 节点通用 UE.Expression

不匹配以上任何一种的 token 会报 Unsupported property type '{Token}'.

紧凑标量 token

七种拼写,在所有可观察的方面完全一致。

Token分量数节点(参数)节点(const
float1UMaterialExpressionScalarParameterUMaterialExpressionConstant
float11UMaterialExpressionScalarParameterUMaterialExpressionConstant
half1UMaterialExpressionScalarParameterUMaterialExpressionConstant
half11UMaterialExpressionScalarParameterUMaterialExpressionConstant
int1UMaterialExpressionScalarParameterUMaterialExpressionConstant
uint1UMaterialExpressionScalarParameterUMaterialExpressionConstant
bool1UMaterialExpressionScalarParameterUMaterialExpressionConstant

intuintboolhalf 在节点层面不带任何整数、布尔或精度语义。它们统统生成浮点 ScalarParameter,材质图也不会做任何截断。写它们是为了可读性,不是为了行为。

标量默认值

float A = 0.5;    float B = -2;    float C = 1e3;    float D = true;

文本按 double 解析,同时接受大小写不敏感的 true1.0false0.0。其他内容报 Invalid scalar default value '{Text}' for property '{Name}'.

不写 = <default> 时不会写入任何值,节点保留引擎默认的 0.0

紧凑向量 token

27 种拼写。每一种都生成 UMaterialExpressionVectorParameter,其 DefaultValue 是完整的 FLinearColor;不同的只有声明的分量数,而分量数决定了 Graph 读取时命中哪个节点输出。 分量数取自 token 的最后一个字符:2 是两分量,4 是四分量,其余都是三分量。

Token分量数节点(const
float22UMaterialExpressionConstant2Vector
float33UMaterialExpressionConstant3Vector
float44UMaterialExpressionConstant4Vector
half22UMaterialExpressionConstant2Vector
half33UMaterialExpressionConstant3Vector
half44UMaterialExpressionConstant4Vector
vec22UMaterialExpressionConstant2Vector
vec33UMaterialExpressionConstant3Vector
vec44UMaterialExpressionConstant4Vector
int22UMaterialExpressionConstant2Vector
int33UMaterialExpressionConstant3Vector
int44UMaterialExpressionConstant4Vector
uint22UMaterialExpressionConstant2Vector
uint33UMaterialExpressionConstant3Vector
uint44UMaterialExpressionConstant4Vector
bool22UMaterialExpressionConstant2Vector
bool33UMaterialExpressionConstant3Vector
bool44UMaterialExpressionConstant4Vector
ivec22UMaterialExpressionConstant2Vector
ivec33UMaterialExpressionConstant3Vector
ivec44UMaterialExpressionConstant4Vector
uvec22UMaterialExpressionConstant2Vector
uvec33UMaterialExpressionConstant3Vector
uvec44UMaterialExpressionConstant4Vector
bvec22UMaterialExpressionConstant2Vector
bvec33UMaterialExpressionConstant3Vector
bvec44UMaterialExpressionConstant4Vector

vec*ivec*uvec*bvec*float*int*uint*bool* 的 GLSL 风格拼写。 没有单分量向量的紧凑 token:float1half1 属于标量。

向量默认值

<anything> ( <part> [ , <part> ] … )
规则行为
( 之前的文本被忽略 —— float4(…)vec3(…)(…)banana(…) 都能解析
分隔范围从第一个 (最后一个 )
各部分按每个 , 拆分;空的部分被丢弃;每部分是 double,或 true / false
1 个 a(a, a, a, 1)
2 个 a, b(a, b, 0, 0)
3 个 a, b, c(a, b, c, 1)
4 个 a, b, c, d(a, b, c, d)
超过 4 个第 5 个及以后从不读取,连解析都不做
任一部分无法解析Invalid vector default value '{Text}' for property '{Name}'.

不写 = <default> 时节点保留引擎默认的 (1, 1, 1, 1)

声明的分量数从不与字面量的元数做校验。 float2 P = float4(1, 2, 3, 4);float4 P = vec2(1, 2); 都能解析。字面量按上表填满 FLinearColor,再由声明的分量数决定读哪个输出 —— 于是 float4 P = vec2(1, 2) 得到的是按 RGBA 读取的 (1, 2, 0, 0)( 之前的 token 同样不校验, 所以 flaot3(1, 0, 0) 这种笔误会被静默接受。字面量的元数和拼写要与声明的 token 保持一致。

紧凑纹理 token

五种拼写,四种不同维度。每一种都生成纹理对象参数 —— 节点携带资产,但不采样它。

Token纹理类型节点(参数)节点(const
Texture2DTexture2DUMaterialExpressionTextureObjectParameterUMaterialExpressionTextureObject
TextureCubeTextureCubeUMaterialExpressionTextureObjectParameterUMaterialExpressionTextureObject
Texture2DArrayTexture2DArrayUMaterialExpressionTextureObjectParameterUMaterialExpressionTextureObject
Texture3DVolumeTexture since 1.3.8UMaterialExpressionTextureObjectParameterUMaterialExpressionTextureObject
VolumeTextureVolumeTexture since 1.3.8UMaterialExpressionTextureObjectParameterUMaterialExpressionTextureObject

Texture3DVolumeTexture 是严格同义词。要采样它们,在 Graph 里交给 TextureSample 内置节点, 或者直接声明 TextureSampleParameter2D

纹理默认值

Texture2D A = Path(Game, "Textures/T_X");
Texture2D B = Path("/Game/Textures/T_X");
Texture2D C = "/Game/Textures/T_X";            // 裸的带引号绝对路径

裸引号形式自 since 1.5.0 起可用。全部 root 拼写和两套错误信息见 Path 资产引用;失败会被包装成 Invalid texture default value '{Text}' for property '{Name}'. {Inner}

未指定资产时的默认值

声明的纹理类型加载的回退资产
Texture2D/Engine/EngineResources/DefaultTexture.DefaultTexture
TextureCube/Engine/EngineResources/DefaultTextureCube.DefaultTextureCube
VolumeTexture/Engine/EngineResources/DefaultVolumeTexture.DefaultVolumeTexture
Texture2DArray不存在

Texture2DArray 没有引擎回退资产。不写 = Path(…) 会导致生成失败: Texture property '{Name}' with type Texture2DArray requires an explicit default asset. 必须显式指定一个数组资产。

维度校验

五个紧凑 token 都声明了明确的维度,因此会拿指定的资产去校验 —— 这里的 Texture2D 意思是 “不是 cube、不是 2D 数组、不是 volume”。不匹配时报

{Context} texture property '{Name}' expects {ExpectedType} but '{Path}' is a '{ActualClass}'.

其中 {Context} 对参数是 Texture,对 const 声明是 Const。加载成功后会执行 AutoSetSampleType(),所以除非元数据覆盖,SamplerType 会跟随资产。

const 声明

since 1.2.6 const 声明生成常量节点而不是参数:材质参数列表里没有它的名字,实例也无法覆盖。

const float Gamma = 2.2;                       // Constant
const vec3  Sky   = vec3(0.2, 0.4, 0.9);       // Constant3Vector
const Texture2D Lut = Path(Game, "T_Lut");     // TextureObject

const 只能和 39 个紧凑 token 搭配。和任意 *Parameter token 或 UE.* 声明搭配会被拒绝: Const property '{Name}' must use a plain scalar, vector, or texture type instead of a parameter node or UE builtin declaration.

const 声明仍然接受元数据块 —— Constant 节点上的 [Desc="…"] 有效;而 Graph 读取 const 向量时 永远命中输出 0,不走参数读取会用的 RG / RGB / RGBA 命名输出。

参数节点 token

22 个直接指定 Unreal 参数表达式类的 token。ScalarParameterVectorParameterTextureObjectParameter 走专用构造路径;其余 token 按名字解析类,依次尝试 <Token>U<Token>MaterialExpression<Token>UMaterialExpression<Token>,在所有非抽象 UMaterialExpression 子类中大小写不敏感地匹配。集合是封闭的 —— 就这 22 个。

#Token类型分量数生成的类= default 接受Graph 调用形式
1ScalarParameterScalar1UMaterialExpressionScalarParameter标量字面量
2StaticBoolParameterScalar1UMaterialExpressionStaticBoolParametertrue / false
3StaticSwitchParameterScalar1UMaterialExpressionStaticSwitchParametertrue / false必须调用 —— N(True = …, False = …)
4VectorParameterVector4UMaterialExpressionVectorParameter向量字面量
5DoubleVectorParameterVector4UMaterialExpressionDoubleVectorParameter向量字面量
6ChannelMaskParameterVector1UMaterialExpressionChannelMaskParameter向量字面量N(Input = …)
7StaticComponentMaskParameterVector4UMaterialExpressionStaticComponentMaskParameter向量字面量N(Input = …)
8CurveAtlasRowParameterVector3UMaterialExpressionCurveAtlasRowParameter向量字面量 —— 只写入 .R
9DynamicParameterVector4UMaterialExpressionDynamicParameter向量字面量
10FontSampleParameterVector4UMaterialExpressionFontSampleParameter向量字面量 —— 被丢弃
11SpriteTextureSamplerVector4UMaterialExpressionSpriteTextureSampler(Paper2D)向量字面量
12TextureObjectParameterTexture0UMaterialExpressionTextureObjectParameterPath(…) / 裸引号路径
13TextureCollectionParameterTexture0UMaterialExpressionTextureCollectionParameterPath(…) / 裸引号路径
14SparseVolumeTextureObjectParameterTexture0UMaterialExpressionSparseVolumeTextureObjectParameterPath(…) / 裸引号路径
15TextureSampleParameter2DVector4UMaterialExpressionTextureSampleParameter2DPath(…) / 裸引号路径N(Coordinates = …)
16TextureSampleParameter2DArrayVector4UMaterialExpressionTextureSampleParameter2DArrayPath(…) / 裸引号路径N(Coordinates = …)
17TextureSampleParameterCubeVector4UMaterialExpressionTextureSampleParameterCubePath(…) / 裸引号路径N(Coordinates = …)
18TextureSampleParameterCubeArrayVector4UMaterialExpressionTextureSampleParameterCubeArrayPath(…) / 裸引号路径N(Coordinates = …)
19TextureSampleParameterVolumeVector4UMaterialExpressionTextureSampleParameterVolumePath(…) / 裸引号路径N(Coordinates = …)
20TextureSampleParameterSubUVVector4UMaterialExpressionTextureSampleParameterSubUVPath(…) / 裸引号路径N(Coordinates = …)
21RuntimeVirtualTextureSampleParameterVector4UMaterialExpressionRuntimeVirtualTextureSampleParameterPath(…) / 裸引号路径N(Coordinates = …)
22SparseVolumeTextureSampleParameterVector4UMaterialExpressionSparseVolumeTextureSampleParameterPath(…) / 裸引号路径N(Coordinates = …, TextureObject = …)

“类型”一列是 DreamShader 的属性类型,不是 Unreal 的引脚类型。Texture 表示“资产值”:节点携带资产, 不产生数值输出。

ChannelMaskParameter1 分量读取,CurveAtlasRowParameter3 分量读取,尽管两者生成的 节点看起来都是四通道的。接收变量要照此声明。

SpriteTextureSampler 属于 Paper2D 插件。Paper2D 未启用时类无法解析,生成失败并报 Could not resolve MaterialExpression class for parameter type 'SpriteTextureSampler'.

token 使用哪个默认值解析器

= <default> 走哪个分支由 token 所属家族决定,而不是由生成的节点实际能存什么决定。

分支Token接受
标量ScalarParameterStaticBoolParameterStaticSwitchParameter标量字面量;两个 static token 接受 true / false
向量VectorParameterDoubleVectorParameterChannelMaskParameterStaticComponentMaskParameterDynamicParameterFontSampleParameterCurveAtlasRowParameterSpriteTextureSampler向量字面量
纹理对象TextureObjectParameterTextureCollectionParameterSparseVolumeTextureObjectParameterPath(…) 资产引用
纹理采样token 15–22Path(…) 资产引用

FontSampleParameterCurveAtlasRowParameterSpriteTextureSampler 不能写 = Path(…) 它们属于向量分支,所以 SpriteTextureSampler S = Path(Game, "T_X"); 会失败并报 Invalid vector default value 'Path(Game,"T_X")' for property 'S'. 请改用元数据绑定资产 —— [Texture=Path(…)][Font=Path(…)][Curve=Path(…); Atlas=Path(…)]

22 个 token 的默认值全部可选。写了默认值时的去向:

情况结果
没有 = <default>什么都不写,节点保留引擎默认值
类没有 DefaultValue UPROPERTY解析出的默认值被静默丢弃 —— 即 FontSampleParameter
类有标量 DefaultValue 但 token 归入向量分支只写入 VectorDefaultValue.R —— 即 CurveAtlasRowParameter,它的 DefaultValue 是曲线行位置
token 是 StaticBoolParameter / StaticSwitchParameter写入字符串 truefalse
其他标量类 token按规范化后的浮点字符串写入
向量类 token写作 (R=…,G=…,B=…,A=…);若被拒绝则改用 (X=…,Y=…,Z=…,W=…) 重试
纹理类 token,或任何带资产路径的 tokenTextureTextureObjectSparseVolumeTextureVirtualTextureTextureCollectionFont 顺序写入第一个存在的槽位

如果这六个资产槽位在类上都不存在,生成失败并报 '{Class}' does not expose a texture/asset property for property '{Name}'.

没有纹理的采样参数照样能编译:对 UMaterialExpressionTextureSampleParameter 子类会调用 SetDefaultTexture(),随后执行 AutoSetSampleType()。这条兜底不适用于 runtime virtual texture、 sparse volume、font 和 curve atlas 节点 —— 它们仍必须绑定资产。

维度:会推断,但基本不校验

八个纹理采样 token 会按拼写做子串测试推断维度,顺序是:CubeTextureCube,然后 ArrayTexture2DArray,然后 VolumeVolumeTexture,否则 Texture2D。(TextureSampleParameterCubeArray 同时含 CubeArrayCube 先命中。这没有可观察影响 —— 生成的类仍然是正确的 cube array 类。)

三个纹理对象 token 刻意声明维度:维度在生成时取自指定的资产。

Token 家族是否用声明的维度校验资产
紧凑 Texture2D / TextureCube / Texture2DArray / Texture3D / VolumeTexture
TextureObjectParameter会,但期望类型是从资产推断的,所以永远不会失败
TextureCollectionParameterSparseVolumeTextureObjectParameter不会
全部八个纹理采样 token不会

TextureSampleParameterCube 指定一张普通 2D 贴图,DreamShader 不会报任何诊断 —— 上表中所有“不会” 的行都走通用反射路径,那里没有维度检查。错误会在稍后由 Unreal 着色器编译器抛出。想要这项检查就用紧凑 token。

Graph 中读取属性

裸标识符读取属性的值。声明的分量数决定读取命中哪个节点输出:

属性种类读取命中的节点输出
任何标量属性输出 0
向量,1 分量(ChannelMaskParameter名为 R 的输出,否则输出 0
向量,2 分量名为 RG 的输出,否则输出 0
向量,3 分量名为 RGB 的输出,否则输出 0
向量,4 分量名为 RGBA 的输出,否则输出 0
任何 const 属性输出 0 —— 跳过命名输出重映射
任何纹理属性输出 0;该值报告 0 分量并被标记为纹理对象

所以 vec2 PRG,而 VectorParameter PRGBA。读取是惰性且带缓存的:节点在首次引用时创建 —— 声明顺序不限制读取 —— 之后每次引用都返回同一个节点。参见 调用运算符与转换

引脚调用形式

since 1.4.1 部分参数可以被调用以连接输入引脚:

vec4 S = BaseTex(Coordinates = UV);
vec4 M = Keep(Input = S);

节点的物化方式与裸读取完全相同 —— 共用同一份缓存 —— 随后每个具名实参去匹配节点的输入引脚。 匹配时两边都只做 trim 和小写化。没有位置参数写法:每个实参都必须具名,且实参值必须是数值。

只有十个 token 会被路由到引脚连接求值器:

ChannelMaskParameter                  TextureSampleParameterCubeArray
StaticComponentMaskParameter          TextureSampleParameterVolume
TextureSampleParameter2D              TextureSampleParameterSubUV
TextureSampleParameter2DArray         RuntimeVirtualTextureSampleParameter
TextureSampleParameterCube            SparseVolumeTextureSampleParameter

其余的 —— 所有紧凑 token 以及剩下十一个 *Parameter token —— 根本不会路由到那里;对它们做调用会落到 函数调用分发器,并以“未知函数”失败。

紧凑 Texture2D 不能被调用。 只有 TextureSampleParameter* 家族拥有采样引脚。紧凑纹理 token 是纹理对象参数,根本没有输入引脚。要么把它当值读出来喂给采样器,要么一开始就声明 TextureSampleParameter2D

哪些引脚可达

引脚名在生成时取自引擎节点,所以可达性既取决于节点,也取决于调用前应用的元数据 —— 元数据在节点创建时 应用,而节点创建早于任何引脚连接。

参数类型始终可用仅在元数据下可用引擎暴露但不可达
ChannelMaskParameterInput
StaticComponentMaskParameterInput
TextureSampleParameter2DCoordinates[MipValueMode="MipLevel"] 下的 MipLevel[MipValueMode="MipBias"] 下的 MipBias[MipValueMode="Derivative"] 下的两个导数引脚,以及 automatic view mip bias 引脚
TextureSampleParameter2DArrayCoordinates同上同上
TextureSampleParameterCubeCoordinates同上同上
TextureSampleParameterCubeArrayCoordinates同上同上
TextureSampleParameterVolumeCoordinates同上同上
TextureSampleParameterSubUVCoordinates同上同上
RuntimeVirtualTextureSampleParameterCoordinatesworld position 引脚和全部四个导数 / mip 引脚,引擎会按节点自身设置重命名它们
SparseVolumeTextureSampleParameterCoordinatesTextureObject[MipValueMode="MipLevel"] 下的 MipLevel[MipValueMode="MipBias"] 下的 MipBias[MipValueMode="Derivative"] 下的两个导数引脚

有些引擎引脚名根本没法写成实参。 实参名是标识符,而匹配只做 trim 和小写化,所以引擎名里含空格或 括号的引脚都不可达:纹理采样节点上的 Apply View MipBiasDDX(UVs)DDY(UVs),以及 runtime virtual texture 节点上的 World PositionTranslated World PositionMip LevelMip BiasDDX (UV)DDX (World)DDY (UV)DDY (World)。请改用元数据设置对应的值 ([ConstCoordinate=…][ConstMipValue=…][AutomaticViewMipBias=…]),或者用 UE.Expression 显式构建节点。

纹理采样参数节点上没有 TextureObject 引脚。 Unreal 的构造函数清掉了 bShowTextureInputPin,所以 Tex(TextureObject = SomeTexture) 会失败并报 Parameter 'Tex' (TextureSampleParameter2D) has no input pin named 'TextureObject'. Asset slots (Texture/Curve/Font/...) are set via [TextureObject=Path(...)] metadata, not call arguments. SparseVolumeTextureSampleParameter 是唯一例外 —— 它确实暴露该引脚。

StaticSwitchParameter

静态开关有专属调用形式,而且不能当作值读取

vec3 C = UseDetail(True = DetailColor, False = BaseColor);
vec3 D = UseDetail(A = DetailColor, B = BaseColor);
vec3 E = UseDetail(DetailColor, BaseColor);          // 位置参数,按此顺序

true 分支依次取 True=A=、第一个位置实参;false 分支依次取 False=B=、第二个位置实参。 两个分支都必填。任一分支都不能是纹理对象或 Substrate 值,两个分支不能一边是 MaterialAttributes 一边是数值,且分量数必须相同。裸写 UseDetail(或 UseDetail.r)会失败并报 Unknown Graph identifier 'UseDetail'.

Properties 中无效的 token

这些在别处是真实存在的 DreamShaderLang 类型 token,但写在 Properties 声明里都会落到 Unsupported property type '{Token}'.

Token有效位置
MaterialAttributes材质函数的 Inputs / Outputs / ResultsShaderOutputs 声明;Function 签名
Substrate同上,且仅限 since UE 5.4
SamplerStateInputs / Outputs / 函数签名,在那里是 Texture2D 的别名
StaticBool材质函数的 Inputs / Outputs —— 在 Properties 里请用 StaticBoolParameter
mat2只在 Function 签名或 Code 体中,解析器把它规范成 float2x2;生成阶段随后拒绝矩阵类型
mat3同上,规范成 float3x3
mat4同上,规范成 float4x4

完整的跨上下文矩阵见 类型与值

命名规则

  • 属性名只要求非空,从不按标识符校验,所以 float 1Bad = 0; 能解析 —— 但它在 Graph 里不可达, 因为那里按标识符查名字。
  • 在一个 Shader 内属性名必须忽略大小写后唯一。在材质函数内,属性名还不能与输入名冲突。
  • [ParameterName="…"] 只改变材质暴露给实例和蓝图的名字;Graph 使用的仍是声明的标识符。

诊断

消息触发原因处理
Unsupported property type '{Token}'.token 不属于 39 个紧凑 token,不属于 22 个 *Parameter token,也不以 UE. 开头。对照上面的表检查拼写。
Invalid scalar default value '{Text}' for property '{Name}'.标量默认值既不是数字也不是 true / false。
Invalid vector default value '{Text}' for property '{Name}'.没有括号分量列表,或某个分量既不是数字也不是 true / false —— 包括在向量分支 token 上写 Path(…)。
Invalid texture default value '{Text}' for property '{Name}'. {Inner}紧凑纹理 token 或 TextureObjectParameter 家族的默认值解析失败。详解
Invalid texture sample default value '{Text}' for property '{Name}'. {Inner}纹理采样 token 的 Path(…) 解析失败。详解
Invalid boolean default value '{Text}' for property '{Name}'.StaticBoolParameter 或 StaticSwitchParameter 上写了非 true/false 的默认值。
Texture property '{Name}' with type Texture2DArray requires an explicit default asset.Texture2DArray 没写 = Path(…),而引擎没有数组回退资产。显式指定一个数组资产。
Texture texture property '{Name}' expects {Expected} but '{Path}' is a '{Class}'.指定资产的类与紧凑 token 声明的维度不符。
Could not resolve MaterialExpression class for parameter type '{Token}'.四种名字拼写都没能匹配到 UMaterialExpression 子类 —— 未启用 Paper2D 时 SpriteTextureSampler 就是这样。
'{Class}' does not expose a texture/asset property for property '{Name}'.给了资产默认值,但类上六个资产槽位一个都没有。
Const property '{Name}' must use a plain scalar, vector, or texture type instead of a parameter node or UE builtin declaration.const 用在了 *Parameter token 或 UE.* 声明上。
Parameter '{Name}' ({Token}) has no input pin named '{Arg}'. Asset slots (Texture/Curve/Font/...) are set via [{Arg}=Path(...)] metadata, not call arguments.实参名与节点当前配置下的任何引脚都不匹配。对照上面的可达引脚表,或改用元数据设置。
Parameter '{Name}' must be called with named arguments wiring its input pins (e.g. {Name}(Coordinates=...) or {Name}(Input=...)).引脚调用形式里使用了位置参数。
Unknown Graph identifier '{Name}'.包括任何对 StaticSwitchParameter 的裸读取 —— 它必须被调用。详解

按阶段罗列的完整清单见 错误速查

示例

Shader(Name="Docs/M_ParameterNodes")
{
    Properties = {
        const float Gamma = 2.2;                       // Constant

        Group("Surface") {
            TextureSampleParameter2D BaseTex = Path(Game, "Textures/T_White") [
                SamplerType   = "LinearColor";
                SamplerSource = "FromTextureAsset";
                MipValueMode  = "None";
            ];
            ScalarParameter Roughness = 0.55 [Slider(0, 1)];
            VectorParameter Tint      = float4(1.0, 0.8, 0.6, 1.0);
        }

        Group("Masks") {
            ChannelMaskParameter         Pick = float4(1, 0, 0, 0) [MaskChannel = "Red"];
            StaticComponentMaskParameter Keep = float4(1, 1, 0, 0);
        }

        StaticSwitchParameter UseDetail = true [Group="Switches"];

        UE.TexCoord(Index = 0) UV;
    }

    Settings = { Domain = "Surface"; ShadingModel = "DefaultLit"; BlendMode = "Opaque"; }

    Outputs = {
        vec3  Color;
        float Rough;

        Base.BaseColor = Color;
        Base.Roughness = Rough;
    }

    Graph = {
        vec4  Sample = BaseTex(Coordinates = UV);
        vec4  Masked = Keep(Input = Sample);
        float Chan   = Pick(Input = Sample);

        Color = UseDetail(True = Masked.rgb, False = Tint.rgb) * Gamma;
        Rough = Roughness * Chan;
    }
}

生成的节点:

Constant(2.2)                 Gamma
TextureSampleParameter2D      BaseTex    Group="Surface" SortPriority=0  SamplerType=LinearColor
ScalarParameter               Roughness  Group="Surface" SortPriority=10 SliderMin=0 SliderMax=1
VectorParameter               Tint       Group="Surface" SortPriority=20
ChannelMaskParameter          Pick       Group="Masks"   SortPriority=30 MaskChannel=Red
StaticComponentMaskParameter  Keep       Group="Masks"   SortPriority=40
StaticSwitchParameter         UseDetail  Group="Switches"
TextureCoordinate             UV         CoordinateIndex=0

下一步

本页目录