assign
assign
在 TSL 中执行赋值操作(=),用于改变一个可变变量(VarNode)的值或修改内置的几何/材质属性。
核心优势
它是 TSL 中状态管理的核心。通过将计算结果存入变量或修改内置属性(如 position),它实现了逻辑控制、代码复用和顶点动画等关键功能,避免了节点图的冗余和因重复计算带来的性能损失。
常见用途
在条件分支(If)中,根据逻辑为变量赋予不同的值,如改变颜色。
在循环(Loop)中作为累加器,不断更新一个变量的值,如叠加多光源光照。
在顶点着色器中修改内置的 `position` 属性,以实现顶点动画或形变。
将复杂的计算结果(如菲涅尔效应)缓存到变量中,以供后续多次使用,提高效率。
如何调整
调整 `assign` 节点的效果,就是调整其 `sourceNode`(赋值的来源)。例如,在顶点动画中,将赋给 `position` 的值从 `position.mul(2)`(放大模型)改为 `position.add(offset)`(沿法线呼吸),会直接改变模型的几何形态。在片元着色器中,将赋给 `metalness` 的值从 `1.0`(全金属)改为一个噪波纹理的采样结果,则会使物体表面呈现出斑驳、非均匀的金属质感。
代码示例
1// 计算一个基于时间和法线的位移
2const offset = normal.mul( sin( time() ).mul( 0.1 ) );
3
4// 将新的位置赋值给内置的 position 属性,实现顶点动画
5assign( position, position.add( offset ) );