创建Unwrapped Positional Texture
这个过程的原理就是对WorldPositionOffset的处理。
当这个Offset为空(即0)时,mesh上每个vertex在它原本该出现的地方(即PositionWS)显色。当这个Offset为ActorPostionWS-PositionWS时,mesh上每个vertex都会在ActorPositionWS处显色,也就是都叠在同一个地方了。此时,给每个Offset加一个独一无二的偏移,则所有的vertex都会在它独一无二的地方显色。所以,关键就是这个偏移的设计,刚好UV坐标就是独一无二的,因此加上UV坐标作为Offset的偏移后,就将所有vertex均匀分布在了UV空间平面。这个空间平面的形状还要受到选择的UV Layout的影响,还可以线性映射到更大的范围,提升光栅化精度。
Material编辑器中的功能单元写法
常见0~1函数图像公式:kynd,参考自《The Book of Shaders》
ObjectLocalBounds
- LocalBoundsMinimal
- GetPrimitiveData(Parameters).LocalObjectBoundsMin.xyz
- LocalBoundsMax
- GetPrimitiveData(Parameters).LocalObjectBoundsMax.xyz
该表达式输出LocalBoundingBox的Min、Max、Size,这个Size就是Max-Min,也就是所谓的Extents的2倍。注意这个BoundingBox是Local系的,可以简单理解为PrimitiveComponent系。参考 Bounding Box
- TransformPosition
- 注意该节点Details里选择的参数,是将PositionWS(Excluding Materials Shader Offset)从WS变换到InstanceSpace,可以简单理解为WS->CS。Excluding Materials Shader Offset这个选项可能是忽略GeometryShader对原始Mesh造成的拉伸,而取Mesh顶点的原始值。
- (PositionCS-LocalBoundingBox.Min) / LocalBoundingBox.Size将PositionCS进行了0-1化
总结一下:该节点将PositionWS变换为PositionCS后进行了LocalBoundingBox内的0-1化
ConstantBiasScale
关键词:线性映射、线性变换
AppendVector
关键词:数据升维
HLSL里坐标变换
- OtherVector = normalize(mul(SomeVector, GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
这个示例是将world系的SomeVector转到PrimitiveComponent系