Unity PolySpatial 的自定义函数节点支持
PolySpatial 的 shader graph 转换通过解析有限的 HLSL 子集并将其转换为 MaterialX 节点,为自定义函数节点(使用“String”函数类型时)提供部分支持。 请注意,这并不允许使用任何超出结合内置着色器图节点所能实现的功能;它只是提供了一种替代的规范方式,对于某些用途来说可能更紧凑或更方便。
与完整的 HLSL 实现相比,用于自定义函数节点的解析器很原始,并且正在积极开发中。
Function Body Format
自定义函数体应包含一系列临时变量或输出的赋值语句。 不得重新分配变量。
示例
下面是一个支持的函数体示例。 注意,代码体仅由赋值语句组成,赋值一个临时变量并用来设置输出值。
float2 xy = float2(In.r * In.a, In.g) * 2.0 - 1.0;
Out = float3(xy, max(1.0e-16, sqrt(1.0 - saturate(dot(xy, xy)))));
Supported Types
解析器可识别标量、向量和矩阵浮点类型:“float”、“float2”、“float3”、“float4”、“float2x2”、“float3x3”、“float4x4”
Supported Operators
解析器支持用于浮点数、向量和矩阵值的基本算术运算符(+
, -
, *
, /
, %
)用于处理“float”、向量和矩阵值,并支持逻辑/比较运算符(!
, &&
, ||
, ==
, !=
, >
, <
, >=
, <=
)用于处理“float”值。 对于“float”条件和“float”或向量值,支持条件操作符 (?:
)。
Swizzling
支持混合向量值。 例如,“float3(1, 2, 3).xz”等效于“float2(1, 3)”。
Supported Functions
HLSL Intrinsic Functions
解析器支持HLSL内部函数的一个子集: abs
、acos
、all
、any
、asin
、atan
、atan2
、ceil
、clamp
、cos
、cosh
、cross
、degrees
、distance
、dot
、exp
、floor
、fmod
、frac
、isinf
、isnan
、length
、lerp
、log
、max
、min
、mul
、normalize
、pow
、radians
、rcp
、reflect
、refract
、round
、rsqrt
、saturate
、sign
、sin
、sinh
、smoothstep
、sqrt
、step
、tan
、tanh
、transpose
、trunc
PolySpatial-Specific Functions
此外,解析器支持自定义“splitlr”函数,该函数实现了MaterialX Spec中描述的splitlr函数:
genType splitlr(genType valuel, genType valer, float center, float2 texcoord);
(其中“genType”是“float”、“float2”、“float3”或“float4”中的一个)。
Unity Macros
对于纹理采样,解析器支持Unity宏:SAMPLE_TEXTURE2D
, SAMPLE_TEXTURE2D_LOD
, SAMPLE_TEXTURECUBE_LOD
Supported Globals
解析器支持Unity的几个内置全局变量:_Time
, _SinTime
, _CosTime
, unity_DeltaTime
, unity_ObjectToWorld
, unity_WorldToObject
, UNITY_MATRIX_V
, UNITY_MATRIX_I_V
, UNITY_MATRIX_P
, UNITY_MATRIX_I_P
, UNITY_MATRIX_VP
, UNITY_MATRIX_I_VP
Note: 目前,visionOS提供的对象到世界矩阵(因此也包括“unity_ObjectToWorld”和“unity_WorldToObject”)包含渲染体的变换:即,在空间中移动(有界)应用程序会影响其世界变换,这与 Position Node 输出的世界位置不同,后者是相对于渲染体的变换而言的,因此在应用程序重新定位时不会发生变化。