DreamShaderLang
内置节点

UE.* 节点

已注册的 UE.* 内置节点、参数、输出宽度,以及 Properties 声明形式。

UE. 命名空间是 DreamShaderLang 创建 Unreal 材质节点的入口。其中有 27 个名字属于已注册内置节点: DreamShader 自己实现了它们,每个对应一个 UMaterialExpression 类和一组固定参数。另有三个名字 —— UE.StaticSwitchParameterUE.CollectionParamUE.SceneTexture —— 在这张表之前被特殊处理。

命名空间里其余的名字都会落到通用反射路径 UE.Expression, 在那里 UE.<Name> 的含义就是「创建 UMaterialExpression<Name>」。所以本页没有列出的名字并不是错误, 只是走了另一条规则不同的代码路径。

命名空间前缀和内置节点名都不区分大小写:ue.texcoord() 就是 UE.TexCoord()。参数名会先去掉首尾空白再 按不区分大小写比较,但除此之外必须精确匹配 —— Un_Mirror_U 不是 UnMirrorU

看目录之前先读这两条

已注册内置节点从不校验参数列表。 每个内置节点只读取自己条目里列出的参数名,其余一律丢弃 —— 未知名字、拼写错误、位置参数都一样,且没有任何诊断。

UE.TexCoord(Indx = 3) 会静默地产生 UV channel 0。UE.Panner(SpedX = 1) 会静默地按节点默认速度平移。 UE.TexCoord(0) 能通过编译并给出 channel 0,是因为位置参数被丢弃、而节点默认值恰好是 0 —— 结果对了, 但是碰巧对的。

如果某个参数看上去没生效,先对照条目检查拼写。唯一会读取位置参数的已注册内置节点只有 UE.TransformVectorUE.TransformPosition(索引 0 是 Input),以及 UE.StaticSwitchParameter (索引 0 和 1 是 TrueFalse)。

已注册内置节点每次调用都会新建一个节点。 它们不查任何复用缓存,UE.StaticSwitchParameterUE.CollectionParam 也一样。在五个地方写 UE.TexCoord(Index = 0),就会生成五个 TextureCoordinate 节点。

只有通用的 UE.Expression 路径、 Substrate.* 包装节点和数学内置会对相同调用去重。 UE.SceneTexture 会脱糖成通用调用,因此它也参与去重。

想要只生成一个节点,就把调用结果赋给一个 Graph 变量,之后复用这个变量。

语法概要

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

<argument> := <arg-name> = <expression>

// 声明形式,写在 Properties 中
UE.<Name> [ ( <key> = <value> [ , <key> = <value> ] … ) ] <property-name> ;

完整名单

全部 27 个已注册内置节点,按注册顺序排列。类名省略了 UMaterialExpression 前缀。

内置节点UMaterialExpression输出参数
UE.TexCoordTextureCoordinatefloat2IndexUTilingVTilingUnMirrorUUnMirrorV
UE.TimeTimefloat1PeriodIgnorePause
UE.PannerPannerfloat2CoordinateTimeSpeedSpeedXSpeedYFractionalPart
UE.WorldPositionWorldPositionfloat3
UE.ObjectPositionWSObjectPositionWSfloat3
UE.CameraVectorWSCameraVectorWSfloat3
UE.VertexNormalWSVertexNormalWSfloat3
UE.VertexTangentWSVertexTangentWSfloat3
UE.ScreenPositionScreenPositionfloat2
UE.VertexColorVertexColorfloat4
UE.PixelDepthPixelDepthfloat1
UE.SceneDepthSceneDepthfloat1
UE.SceneColorSceneColorfloat4
UE.TranslatedWorldPositionWorldPosition,相机相对float3
UE.ObjectPositionObjectPositionWSfloat3
UE.ObjectRadiusObjectRadiusfloat1
UE.ObjectBoundsObjectBoundsfloat3
UE.CameraVectorCameraVectorWSfloat3
UE.CameraPositionCameraPositionWSfloat3
UE.ReflectionVectorReflectionVectorWSfloat3
UE.PixelNormalWSPixelNormalWSfloat3
UE.TwoSidedSignTwoSidedSignfloat1
UE.PerInstanceRandomPerInstanceRandomfloat1
UE.PerInstanceFadeAmountPerInstanceFadeAmountfloat1
UE.ViewportUVScreenPositionfloat2
UE.TransformVectorTransformfloat3InputSourceDestination
UE.TransformPositionTransformPositionfloat3InputSourceDestinationPeriodicWorldTileSizeFirstPersonInterpolationAlpha

上表中每个宽度都是权威的,因此任何已注册内置节点都可以在分量数不一致的二元运算中充当加宽的一方。 参见运算符与转换。这些内置节点都不会产生纹理对象、MaterialAttributes 值或 Substrate 值。

有四个内置节点是条件注册的。 UE.ObjectPositionWSUE.ObjectPositionUE.ScreenPositionUE.ViewportUV 只有在当前编辑器能解析出对应引擎类时才会被加入表中 —— object position 在 UE 5.5+ 可直接解析,screen position 在 UE 5.6+ 可直接解析;低于这些版本时通过按名查找 /Script/Engine.MaterialExpressionObjectPositionWS/Script/Engine.MaterialExpressionScreenPosition 解析。

查找失败时该内置节点根本不会注册,调用会落到通用路径,并以 Unsupported UE builtin call '{Name}' in Graph. … 失败 —— 除非你补上 OutputType

别名

名单里有四个名字是已有条目的第二种写法,两种写法创建的节点类完全相同。

别名等同于区别
UE.ObjectPositionUE.ObjectPositionWS
UE.CameraVectorUE.CameraVectorWS
UE.ViewportUVUE.ScreenPosition无 —— 引擎没有专门的 ViewportUV 类,两者都读 ScreenPosition 的 output 0,而它就是 viewport UV
UE.TranslatedWorldPositionUE.WorldPosition强制打开相机相对的 shader-offset 模式,而不是节点默认的绝对模式

带参数的内置节点

UE.TexCoord

float2 uv    = UE.TexCoord(Index = 0);
float2 tiled = UE.TexCoord(Index = 0, UTiling = 2.0, VTiling = 2.0);
参数类型默认值必需
Index整数字面量节点默认值,UV channel 0
UTiling数值字面量节点默认值
VTiling数值字面量节点默认值
UnMirrorU布尔字面量节点默认值
UnMirrorV布尔字面量节点默认值

这里接受 CoordinateIndex 这个写法 —— 只有声明形式接受它。表达式形式下 负的 Index 会被接受且没有任何诊断。

UE.Time

float t      = UE.Time();
float looped = UE.Time(Period = 2.0, IgnorePause = true);
参数类型默认值必需
Period数值字面量不写时节点的周期覆盖保持关闭
IgnorePause布尔字面量节点默认值

写了 Period 同时也会打开节点的周期覆盖开关。Graph 中不做范围检查:负的 Period 会被原样写入。 声明形式则会拒绝它。

UE.Panner

float2 panned = UE.Panner(Coordinate = UE.TexCoord(Index = 0),
                          Time       = UE.Time(),
                          SpeedX     = 0.1,
                          SpeedY     = 0.0);
参数类型默认值必需
Coordinate输入 pin未连接
Time输入 pin未连接
Speed输入 pin未连接
SpeedX数值字面量节点默认值
SpeedY数值字面量节点默认值
FractionalPart布尔字面量节点默认值

表达式形式不接受 ConstCoordinate。声明形式接受它,通用路径也可以用 UE.Expression(Class = "Panner", OutputType = "float2", ConstCoordinate = 1) 触达。

UE.TransformVector

在不同坐标系之间变换方向。只做旋转、不做平移,这也正是它不适合用于点的原因。

vec3 worldNormal = UE.TransformVector(LocalNormal, Source = "Tangent", Destination = "World");
参数类型默认值必需
Input输入 pin;也可以作为索引 0 的位置参数传入
Source文本字面量"Tangent"
Destination文本字面量"World"

两个坐标系参数接受同样的九种写法,对应六个引擎取值。所有写法在 UE 5.3 – 5.8 上都可用,也不存在某一侧 接受而另一侧拒绝的写法。

写法坐标系
Tangent切线空间
Local局部空间
World绝对世界空间
AbsoluteWorld绝对世界空间 —— World 的别名,不是独立的坐标系
View视图空间
Camera相机空间
Instanceinstance / particle 空间
Particleinstance / particle 空间
InstanceParticleinstance / particle 空间

坐标系名会先去掉首尾空白再按不区分大小写比较,因此 "world""World"" WORLD " 是同一个 token。 空格、下划线和连字符不会被去掉:"absolute world""absolute_world" 解析不了 —— 要写 "AbsoluteWorld"。带引号的字符串和裸标识符等价,Source = WorldSource = "World" 相同。

任何一侧解析失败都只会产生这一条消息:UE.TransformVector Source/Destination is invalid. —— 它不会告诉你是哪一侧。

UE.TransformPosition

在不同坐标系之间变换,会应用平移。

vec3 viewP = UE.TransformPosition(UE.WorldPosition(),
                                  Source      = "World",
                                  Destination = "TranslatedWorld");
参数类型默认值必需
Input输入 pin;也可以作为索引 0 的位置参数传入
Source文本字面量"Local"
Destination文本字面量"World"
PeriodicWorldTileSize since UE 5.5输入 pin未连接
FirstPersonInterpolationAlpha since UE 5.6输入 pin未连接

注意默认的 SourceUE.TransformVector 不同:这里是 "Local",那里是 "Tangent"

SourceDestination 共用同一个解析器,因此两个参数接受的集合完全一致。十三种写法对应八个引擎取值。

写法坐标系要求
Local局部空间
World绝对世界空间
AbsoluteWorld绝对世界空间
PeriodicWorld周期世界空间since UE 5.5
TranslatedWorld相机相对世界空间
CameraRelativeWorld相机相对世界空间
FirstPerson第一人称平移世界空间since UE 5.6
FirstPersonTranslatedWorld第一人称平移世界空间since UE 5.6
View视图空间
Camera相机空间
Instanceinstance / particle 空间
Particleinstance / particle 空间
InstanceParticleinstance / particle 空间

低于版本门槛的写法会被报成坐标系无效,而不是版本错误。 在 UE 5.3 或 5.4 上, UE.TransformPosition(P, Destination = "PeriodicWorld") 报的是 UE.TransformPosition Source/Destination is invalid. —— 和拼错时一模一样的消息。

两个受版本限制的输入彼此还不一致。低于 UE 5.5 时,PeriodicWorldTileSize 会被静默丢弃:不应用、 不校验、不报错。低于 UE 5.6 时,FirstPersonInterpolationAlpha 是硬错误 (UE.TransformPosition FirstPersonInterpolationAlpha requires Unreal Engine 5.6 or newer.)。

要让源文件在 5.3 – 5.8 之间可移植,应该在编写侧自行判断,而不是指望参数会被拒绝。

不带参数的内置节点

27 个里有 22 个完全不接受参数。它们创建节点时所有输入 pin 都保持未连接。

位置与几何

调用输出说明
UE.WorldPosition()float3绝对世界位置;节点的 shader-offset 模式保持默认
UE.TranslatedWorldPosition()float3同一个节点,但强制打开相机相对模式;等价于 HLSL 的 GetTranslatedWorldPosition(Parameters)
UE.ObjectPositionWS()float3条件注册
UE.ObjectPosition()float3UE.ObjectPositionWS 的别名,条件注册规则相同
UE.ObjectRadius()float1
UE.ObjectBounds()float3
UE.CameraPosition()float3CameraPositionWS

要用 WorldPosition 的其他 shader-offset 模式,走通用路径: UE.Expression(Class = "WorldPosition", OutputType = "float3", WorldPositionShaderOffset = …)

向量与法线

调用输出说明
UE.CameraVectorWS()float3
UE.CameraVector()float3UE.CameraVectorWS 的别名
UE.VertexNormalWS()float3
UE.VertexTangentWS()float3
UE.PixelNormalWS()float3
UE.ReflectionVector()float3ReflectionVectorWS
UE.TwoSidedSign()float1

屏幕与场景

调用输出说明
UE.ScreenPosition()float2条件注册;节点的 output 0 是 viewport UV
UE.ViewportUV()float2UE.ScreenPosition 的别名,读同一个输出
UE.PixelDepth()float1当前像素的场景读取;不接 UV 也不接 offset 输入
UE.SceneDepth()float1节点的 UV 输入保持未连接
UE.SceneColor()float4

要给场景深度读取接一个 UV,走通用路径: UE.Expression(Class = "SceneDepth", OutputType = "float1", Input = <uv>)

两个使用面对 ScreenPosition 的看法不一致。在 Graph 中结果是 2 个分量;作为 property 声明时解析器声明为 4 个分量。没有任何机制去调和它们 —— 宽度要紧时请写 Graph 形式。

逐顶点与逐实例数据

调用输出
UE.VertexColor()float4
UE.PerInstanceRandom()float1
UE.PerInstanceFadeAmount()float1

特殊处理的内置节点

这三个名字在已注册表之前被解析,不遵循那张表的规则。

UE.StaticSwitchParameter

since 1.2.3

创建一个会出现在材质实例编辑器里的静态开关,美术不用改源码就能切换分支。

vec3 color = UE.StaticSwitchParameter(Name        = "UseDetail",
                                      True        = detailColor,
                                      False       = baseColor,
                                      Default     = true,
                                      Group       = "Switches",
                                      Description = "Choose the detail branch");
参数别名类型默认值必需
NameParameterName文本字面量,去空白后非空
TrueA、位置索引 0
FalseB、位置索引 1
DefaultDefaultValue布尔字面量false
Group文本字面量
Description文本字面量
SortPriority整数字面量节点默认值

输出的分量数和 MaterialAttributes 标记都取自 True 分支。两条分支必须一致:都不能是纹理对象或 Substrate 值,不能一边是 MaterialAttributes 一边是数值,分量数也必须相等。

参数会以「仅编辑器」的静态开关值注册到生成的材质上;在材质函数内部则不会注册任何东西。如果同一个 property 名下已经注册过节点,会复用它而不是再建一个。

GroupDescription 走的是宽容的文本处理:值如果不是文本字面量,参数会被静默丢弃SortPriorityDefault 则会对非法值报错。

UE.CollectionParam

since 1.2.3

UMaterialParameterCollection 中读取标量或向量参数。UE.CollectionParameter 是可接受的第二种写法。

float wind = UE.CollectionParam(Collection = Path(Game, "Collections/MPC_Wind"),
                                Parameter  = "WindStrength");
参数别名类型默认值必需
CollectionAssetPath(…) 调用或 Unreal object path
ParameterParameterName文本字面量,非空
Group since UE 5.7文本字面量
SortPriority since UE 5.7整数字面量节点默认值
Description文本字面量

集合会在生成时加载,参数按名字在其中查找。输出宽度取决于查到的类型:

集合中的参数类型输出
向量float4
标量float1
都不是错误

低于 UE 5.7 时,GroupSortPriority 会被静默丢弃SortPriority 在所有引擎版本上仍会被解析、 仍会对非整数值报错 —— 只是不起作用。节点的 ExpressionGUID 同样只在 UE 5.7+ 上写入。Description 在所有版本上都会写入。

和名单里所有内置节点不同,这个节点的输出宽度不是权威的 —— UE.StaticSwitchParameter 也一样。 两者都不能在分量数不一致的二元运算中充当加宽的一方。

UE.CollectionParam 也是唯一被放在负 X 坐标(-520)上的内置节点;其余已注册内置节点落在 520, 声明形式落在 -800。

Path(…) 的语法和可用根目录见 Path 资产引用

UE.SceneTexture

纯语法糖,在所有其他 UE. 名字之前解析。

float4 scene = UE.SceneTexture(Id = "PostProcessInput0");
参数类型默认值必需
Id文本字面量

它会把调用改写成

UE.Expression(Class = "SceneTexture", OutputType = "float4", SceneTextureId = <Id>)

然后求值,所以节点是 UMaterialExpressionSceneTexture、输出 float4,之后 通用路径的所有规则都适用 —— 包括节点复用。

调用必须恰好有一个参数,且名字必须是 Id;其他写法都会失败: UE.SceneTexture expects exactly Id="..." (e.g. Id="PostProcessInput0").

Id 文本走反射枚举写入器,它接受带或不带枚举前缀的条目名、完全限定名和显示名,比较时忽略大小写, 并忽略空格、_-:./ 这些字符。"PostProcessInput0""PPI_PostProcessInput0""ppi postprocessinput0" 都选中同一个值。

Properties 声明形式

UE.<Name>(…) 也可以出现在Properties section 中类型 token 的位置。 节点在生成时创建一次,并绑定到一个 property 名上,供 Graph 读取。

Properties {
    UE.TexCoord(Index = 0) UV;
    UE.CollectionParam(Collection = Path(Game, "MPC_Weather"), Parameter = "Wind") Wind;
}

Graph {
    Color = vec3(UV.x, UV.y, Wind);
}

这是一套独立的实现,目录更小、规则也不同。不要把表达式形式的规则套到这里。

规则声明形式表达式形式
参数语法Key=Value 文本对;值不带引号并去空白,键转小写完整表达式,允许嵌套调用
未知参数名错误静默忽略
重复参数名错误最后一个生效
位置参数无法表达三个内置节点接受
参数顺序丢失 —— 参数存在 map 里保留
行内默认值(= …错误不适用
节点画布 X-800520,UE.CollectionParam 为 -520
输出宽度来自解析器自己的表,或 OutputType来自节点

最容易踩的是行内默认值。参数要写在括号里:

// 正确
UE.TexCoord(Index = 0) UV;

// 错误:UE builtin property 'UV' does not support inline defaults.
UE.TexCoord UV = 0;

可识别的名字

不在本行范围内的参数会被拒绝: UE.{Name} for property '{Property}' does not support argument '{Argument}'.

UE.Name节点类接受的参数与表达式形式的差异
TexCoordTextureCoordinateIndexCoordinateIndexUTilingVTilingUnMirrorUUnMirrorV接受 CoordinateIndex;两种写法同时给出是错误;负索引是错误
TimeTimePeriodIgnorePausePeriod 必须 ≥ 0
PannerPannerCoordinateTimeSpeedSpeedXSpeedYConstCoordinateFractionalPart接受 ConstCoordinateCoordinate 接受整数(写入 ConstCoordinate property 引用
WorldPositionWorldPositionShaderOffsets接受 ShaderOffsets
ObjectPositionWSObjectPositionWSOrigin接受 Origin
CameraVectorWSCameraVectorWS任何参数都是错误,而不是被忽略
ScreenPositionScreenPosition声明为 4 个分量,不是 2
VertexColorVertexColor任何参数都是错误
CollectionParamCollectionParameterCollectionParameterCollectionAssetParameterParameterNameOutputTypeResultType没有 Group / SortPriority / Description
其他任何名字由反射解析需要 OutputTypeResultTypeUE.Expression

ShaderOffsets 词表 —— 转小写并去掉空格后比较:

Token含义
defaultincludingshaderoffsetsabsolute含 shader offset 的绝对世界位置
excludeallshaderoffsetsexcludingallshaderoffsetsnooffsets绝对世界位置,排除 offset
camerarelative相机相对世界位置
camerarelativenooffsetscamerarelativeexcludeoffsets相机相对世界位置,排除 offset

Origin 词表 —— 转小写并去掉空格后比较:

Token含义
absoluteworld绝对原点
camerarelative相机相对原点

声明的输出宽度

声明宽度取自下列第一个能解析出结果的来源:

  1. 显式的 OutputTypeResultType 参数,取自缩减 token 集
  2. 解析器自己的名字表,见下;
  3. CollectionParam / CollectionParameter,声明为 1 分量标量;
  4. 都不满足则拒绝该声明。
名字声明为
TexCoordPanner向量,2
Time标量,1
WorldPositionCameraVectorWSObjectPositionWSVertexNormalWSVertexTangentWS向量,3
ScreenPositionVertexColor向量,4

这张表列了十个名字,它既不是表达式形式的名单,也不是上面那张可识别名字表。VertexNormalWSVertexTangentWS 在这里有声明宽度,却没有建节点的分支,所以它们和 SceneColorPixelDepthTranslatedWorldPosition 以及其余 27 个一样,只能通过显式 OutputType 以声明形式使用。不写 OutputType 时声明能解析通过,然后在生成阶段失败: This builtin is not implemented by the material generator yet. …

UE.* property 上不允许写 const 限定符: Const property '{Name}' must use a plain scalar, vector, or texture type instead of a parameter node or UE builtin declaration.

一些值得知道的细节

  • UE.* 调用可以直接 swizzle —— UE.TexCoord(Index = 0).x 就是普通的后缀链。参见 运算符与转换
  • UE.* 名字在用户声明之前解析,所以叫 TexCoord 的 property 或函数不会遮蔽 UE.TexCoord。不过也 没有任何机制阻止你声明一个叫 TexCoord 的 property,并以裸标识符形式读取它。参见 调用
  • 已注册内置节点从不接受 OutputTypeClassOutputOutputNameOutputIndex。它们只在 通用路径上被读取;在已注册内置节点上会像任何未知名字一样被静默丢弃。
  • GraphFunction 内部,UE.* 调用会被提升出 HLSL 体,变成生成的 Custom 节点上的输入 pin。

诊断

{Function}作者书写的内置节点名,保留原始大小写 —— 只有一个例外: Failed to create UE.{Function}. 打印的是注册时的写法。

消息触发原因处理
UE.{Function} requires parameter: {Argument}必需的输入既没有按名字给出,也没有按位置给出 —— 最常见的是 UE.TransformVector 或 UE.TransformPosition 的 Input。用 Input = … 传值,或作为第一个位置参数传入。
UE.{Function} {Argument} must be an integer literal.整数参数处给了非整数值。
UE.{Function} {Argument} must be a numeric literal.标量参数处给了非数值。
UE.{Function} {Argument} must be a boolean literal.值不是 true / false。
UE.{Function} {Argument} must be a text value.文本参数处给了非文本值。
UE.TransformVector Source/Destination is invalid.任一坐标系 token 不在向量词表中。消息不会说明是哪一侧失败。对照九个可用的向量坐标系检查两侧拼写。
UE.TransformPosition Source/Destination is invalid.任一坐标系 token 不在位置词表中,包括高于当前引擎版本的 token。
UE.TransformPosition FirstPersonInterpolationAlpha requires Unreal Engine 5.6 or newer.在 UE 5.3 – 5.5 上给出了该参数。
UE.SceneTexture expects exactly Id="..." (e.g. Id="PostProcessInput0").参数不是恰好一个,或参数名不是 Id。
StaticSwitchParameter '{Name}' requires True=... and False=... inputs.缺少一条分支。
StaticSwitchParameter '{Name}' branches must have the same component count, got {Left} and {Right}.两条分支宽度不同。这里不做加宽。
StaticSwitchParameter '{Name}' cannot switch Texture object values.某条分支是纹理对象。先采样纹理,再切换采样结果。
UE.CollectionParam collection '{Collection}' does not contain parameter '{Name}'.该名字既不是集合的标量参数也不是向量参数。
UE.CollectionParam could not load MaterialParameterCollection '{Path}'.资产加载成了别的类型,或者根本没加载上。
Failed to create UE.{Function}.材质节点创建失败。
Unsupported UE builtin function '{Function}'. Use OutputType="float1/2/3/4/Texture2D/TextureCube/Texture2DArray/VolumeTexture" for generic MaterialExpression calls.property 声明的名字不在解析器的表里,又没有给 OutputType。补上 OutputType,或把调用移进 Graph 块。 详解
UE.{Function} for property '{Property}' does not support argument '{Argument}'.声明形式中给了该内置节点接受集合之外的参数。
UE builtin property '{Property}' does not support inline defaults. Put arguments inside UE.{Function}(...).声明写成了 UE.TexCoord(…) UV = 1;

声明形式在生成阶段产生的每条消息还会再包一层: UE.{Function} for property '{Property}': {Message}。完整清单见错误速查

示例

Shader(Name="Docs/M_UEBuiltins")
{
    Properties {
        vec3 Tint = vec3(1.0, 0.6, 0.2);
        UE.TexCoord(Index = 0) UV0;
    }

    Settings {
        Domain       = "UI";
        ShadingModel = "Unlit";
    }

    Outputs {
        vec3 Color;
        Base.EmissiveColor = Color;
    }

    Graph {
        float2 uv   = UE.Panner(Coordinate = UV0, Time = UE.Time(), SpeedX = 0.1, SpeedY = 0.0);
        float3 wp   = UE.TranslatedWorldPosition();
        float3 nrm  = UE.TransformVector(UE.VertexNormalWS(), Source = "World", Destination = "Tangent");
        float  fade = UE.PerInstanceFadeAmount();
        float4 vcol = UE.VertexColor();

        Color = (vec3(uv.x, uv.y, wp.z) + nrm) * Tint * vcol.rgb * fade;
    }
}

生成的节点:

TextureCoordinate  (Index 0)                  <- UV0        (Properties, X = -800)
Panner             (Coordinate, Time, SpeedX) <- uv         (X = 520)
Time                                          <- Panner.Time
WorldPosition      (camera-relative)          <- wp
VertexNormalWS                                -> Transform
Transform          (World -> Tangent)         <- nrm
PerInstanceFadeAmount                         <- fade
VertexColor                                   <- vcol

接下来

本页目录