跳转到内容

Unity ShaderGraph 对照

LayaAir 的着色器蓝图在节点能力上已与 Unity ShaderGraph 高度对齐,并提供了 Unity 资源导出插件.shadergraph 批量转换成 .bps。本页给出逐节点对照, 既服务于手工重建,也说明自动转换时哪些地方会有差异。

Unity 节点LayaAir 蓝图节点备注
PositionNodeinputdata/vertex/positionOS按节点的 Space 设置自动选 OS / WS
NormalVectorNodeinputdata/vertex/normalOS同上
TangentVectorNodeinputdata/vertex/tangentOS同上
BitangentVectorNodeinputdata/geometry/biNormalWS
UVNodeinputdata/vertex/uv
VertexColorNodeinputdata/vertex/VertexColor
ViewDirectionNodeinputdata/camera/viewDirection
ViewVectorNodeinputdata/camera/viewVector未归一化
CameraNodeinputdata/camera/cameraPosition仅取 Position 输出
ScreenNodeinputdata/camera/viewport含 x / y / width / height 拆分输出
ScreenPositionNodeuv/screenTexcoord
ObjectNodeinputdata/object/objectPosition
TimeNodeinputdata/scene/Time仅 Time 输出,见下方差异说明
FogNodeinputdata/scene/fog三输出:RGBA / Color / Density
SceneColorNodeinputdata/scene/sceneColor需相机开启不透明纹理
SceneDepthNodeinputdata/scene/sceneDepth需相机开启深度纹理
MainLightDirectionNodeinputdata/light/mainLightDirection
BooleanNodebasic/Boolean
IntegerNodebasic/Int
Vector1Node / SliderNodebasic/FloatSlider 的 min/max 仅编辑器用,转成常量
Vector2Node / Vector3Node / Vector4Nodebasic/Vector2 / Vector3 / Vector4
ColorNodebasic/Vector4
ConstantNodeinputdata/basic/constantPI / TAU / PHI / E / SQRT2
BlackbodyNodeinputdata/basic/blackbody
DielectricSpecularNodeinputdata/pbr/dielectricSpecular
MetalReflectanceNodeinputdata/pbr/metalReflectance
Unity 节点LayaAir 蓝图节点备注
SampleTexture2DNodetexture/sampler2D含 RGBA / R / G / B / A 五路输出
Texture2DAssetNodetexture/texture2D
SampleCubemapNode / SampleRawCubemapNodetexture/samplerCube
CubemapAssetNodetexture/textureCube
SampleTexture2DArrayNodetexture/sample2DArrayUV 与 Index 需手工拼成 vec3,见差异说明
Texture2DArrayAssetNodetexture/texture2DArray
SampleTexture3DNodetexture/sample3D
Texture3DAssetNodetexture/texture3D
NormalFromTextureNodecolor/normalFromTexture
TilingAndOffsetNodeuv/Tiling And Offset
RotateNodeuv/rotateUnit 模式(弧度 / 角度)保留
TwirlNodeuv/twirl
SpherizeNodeuv/spherize
RadialShearNodeuv/radialShear
PolarCoordinatesNodeuv/polarCoordinates
FlipbookNodeuv/flipbookInvertX / InvertY 开关保留
Unity 节点LayaAir 蓝图节点备注
EllipseNodeprocedural/ellipse
RectangleNodeprocedural/rectangleFastest / Nicest 模式保留
RoundedRectangleNodeprocedural/roundedRectangle
PolygonNodeprocedural/polygon
RoundedPolygonNodeprocedural/roundedPolygon
CheckerboardNodeprocedural/checkerboard
GradientNoiseNodefunction/GradientNoiseFloat哈希算法不同
NoiseNode / SimpleNoiseNodefunction/SimpleNoiseFloat哈希算法不同
VoronoiNodefunction/VoronoiFloat哈希算法不同
Unity 节点LayaAir 蓝图节点
AddNode / SubtractNode / MultiplyNode / DivideNodemath/basic/add / minus / multiply / divide
OneMinusNodemath/basic/oneMinus
AbsoluteNode / SignNodemath/common/abs / sign
FloorNode / CeilingNode / FractionNodemath/common/floor / ceil / fract
ModuloNodemath/common/mod
MinimumNode / MaximumNodemath/common/min / max
ClampNode / SaturateNodemath/common/clamp
LerpNodemath/common/mix
StepNode / SmoothstepNodemath/common/step / smoothstep
NegateNodemath/advanced/negate
PosterizeNodemath/advanced/posterize
ReciprocalNode / ReciprocalSquareRootNodemath/advanced/reciprocal / reciprocalSqrt
RoundNode / TruncateNodemath/round/round / truncate
PowerNode / SquareRootNodemath/exponential/pow / sqrt
ExponentialNode / LogNodemath/exponential/exp / log
SineNode / CosineNode / TangentNodemath/trigonometry/sin / cos / tan
ArcsineNode / ArccosineNode / ArctangentNodemath/trigonometry/asin / acos / atan
Arctangent2Nodemath/trigonometry/atan2
DegreesToRadiansNode / RadiansToDegreesNodemath/trigonometry/radians / degrees
HyperbolicSineNode / HyperbolicCosineNode / HyperbolicTangentNodemath/trigonometry/hyperbolicSine / hyperbolicCosine / hyperbolicTangent
LengthNode / DistanceNodemath/geometric/length / distance
DotProductNode / CrossProductNodemath/geometric/dot / cross
NormalizeNodemath/geometric/normalize
ReflectionNodemath/geometric/reflect
RefractNodemath/vector/refract
ProjectionNode / RejectionNodemath/vector/projection / rejection
SphereMaskNodemath/vector/sphereMask
RotateAboutAxisNodemath/vector/rotateAboutAxis
InverseLerpNodemath/interpolation/inverseLerp
RemapNodemath/range/remap
RandomRangeNodemath/range/randomRange
SawtoothWaveNode / SquareWaveNode / TriangleWaveNode / NoiseSineWaveNodemath/wave/ 同名节点
FresnelNode / FresnelEffectNodemath/effect/fresnel
CombineNodemath/expression/append
DDXNode / DDYNode / DDXYNodemath/derivative/DDX / DDY / DDXY
MatrixTransposeNode / MatrixDeterminantNodemath/matrix/matrixTranspose / matrixDeterminant
MatrixSplitNode / MatrixConstructionNodemath/matrix/matrixSplit / matrixConstruction
TransformNode / TransformationMatrixNodemath/matrix/transform / transformationMatrix
Unity 节点LayaAir 蓝图节点备注
AndNode / OrNode / NandNode / NotNodelogic/and / or / nand / not
AllNode / AnyNodelogic/all / any
BranchNode / BranchOnInputConnectionNodelogic/branch
ComparisonNodelogic/comparison六种比较模式保留
IsNanNode / IsInfiniteNodelogic/isNaN / isInfinite
SwizzleNodechannel/swizzle
FlipNode / ChannelMaskNodechannel/flip / channelMask
SplitNode转换器特殊处理拆成分量后直接接下游
Unity 节点LayaAir 蓝图节点备注
BlendNodecolor/blend22 种模式逐一对齐
SaturationNode / HueNode / ContrastNodecolor/saturation / hue / contrast
WhiteBalanceNodecolor/whiteBalance
ReplaceColorNode / ColorMaskNodecolor/replaceColor / colorMask
InvertColorsNodecolor/invertColors
ColorspaceConversionNodecolor/colorspaceConversion9 种组合
ChannelMixerNodecolor/channelMixer
FadeTransitionNodecolor/fadeTransition
NormalBlendNodecolor/normalBlendDefault / Reoriented
NormalStrengthNodefunction/normalScale
NormalUnpackNodecolor/normalUnpack
NormalReconstructZNodecolor/normalReconstructZ
NormalFromHeightNodecolor/normalFromHeight
DitherNodeutility/dither

以下 Unity 节点没有一一对应的 Laya 原生节点,转换时生成 function/custom 内嵌 GLSL。 功能可用,但在蓝图里表现为一个代码块而不是可视化节点:

Unity 节点说明
CustomFunctionNodeUnity 侧本来就是自定义代码,直译过来是正确做法
GradientNode / SampleGradient渐变数据在编译期已知,转换器把采样内联展开成 mix
TriplanarNode三平面映射
KeywordNode关键字分支
IsFrontFaceNodeLaya 有 logic/isFrontFace,但输出类型语义不同,暂走 custom

以下 Unity 节点目前没有映射,自动转换时会被跳过。手工重建时需要用其他方式实现:

Unity 节点情况替代方案
SamplerStateNodeLaya 无独立采样器状态概念采样器设置在纹理资源的导入设置里配置
ParallaxOcclusionMappingNode需要在循环中反复采样纹理,受蓝图框架限制无法实现uv/parallax 单步视差近似
ParallaxMappingNode语义不匹配(Unity 内部采高度图并自动算切线视线;Laya 取显式标量与视线)uv/parallax,自己接高度与视线
SplitTextureTransformNode拆纹理的 tiling / offset 元数据自己用 Params 传入 tiling / offset
Texture2DPropertiesNode纹理尺寸等元数据未暴露用 Params 传入尺寸常量
CalculateLevelOfDetailTexture2DNode纹理 LOD 查询未暴露
GatherTexture2DNode需要 ES 3.1 的 gather用四次相邻采样手工模拟
SceneDepthDifferenceNode需要位置输入sceneDepth 自己相减
EyeIndexNodeVR 眼索引
SubGraphNode转换器不展开 Unity 子图在 Laya 侧用蓝图函数 .bpsf重建

即使节点已映射,下面这些地方两边行为不完全一致,迁移后需要检查:

Unity 大量节点是「动态维度向量」,会自动为不同维度的输入做广播。Laya 的多态节点只能锁定一种类型, 所有输入被统一到同一维度。Unity 图里依赖隐式广播的地方,转过来需要显式用 append / mask / swizzle 对齐维度。这是两边最主要的结构性差异。

Unity 的 Time 节点有 Time / Sine Time / Cosine Time / Delta Time / Smooth Delta 五路输出; Laya 的 Time单个标量。转换时只取 Time,其余输出会退化。需要 Sine Time 请自己接 sin; Delta Time 类需要引擎逐帧增量,目前无对应。

Unity 的 Position / Normal Vector / Tangent Vector 带 Space 选项(Object / View / World / Tangent / AbsoluteWorld)。转换器会读取该设置并选择 Laya 的 OS / WS 版本;但 View 与 Tangent 空间没有直接对应,会回落并给出告警。用到这两个空间时请手工用 math/matrix/transformTBNMatrix 补上。

Unity 的 SampleTexture2DArray 是 UV(vec2) + Index(float) 两个输入;Laya 的 sample2DArray 是单个 Coord(vec3)。转换后 Index 会丢失,需要手工用 append 拼成 vec3(uv, layer) 再接进去。

三个噪声节点的整体特征一致,但哈希算法不同,逐像素图案不会一样。依赖噪声精确图案的效果 (如特定形状的溶解边缘)迁移后需要重新调 Scale 与阈值。

  • 矩阵主序:Unity(HLSL)行主序、Laya(GLSL)列主序。手工重建矩阵时注意按列填。
  • 法线贴图绿通道:Unity 用 DirectX 约定,选 Laya 的 sampler2DNormal(DX) 才一致。
  • transform 的 Normal 模式按 Direction 近似,非均匀缩放物体上不精确。
  • ObjectNode 在开启 GPU 实例化时取不到逐实例数据。

本文更新于