nodeObjectIntent
nodeObjectIntent
将任意 JS 值/已有节点包装成带“变量意图”(var intent) 的节点代理;编译时更倾向把它物化为着色器局部变量,可作为 addAssign/mulAssign 等赋值运算的左值,并避免对相同表达式的重复求值。
核心优势
一行把常量/表达式提升为可复用变量,减少 GLSL 代码内联与冗余计算;同时保留 Proxy 的链式 API 与类型推断。当传入原始值会自动转为常量节点(可用 altType 指定类型);传入着色器函数对象则自动包装为 Fn 节点。
常见用途
构建逐步累加/修改的中间量,作为 addAssign、subAssign 的左值。
把复杂表达式包成变量以在多个位置复用,降低重复开销。
将 JS 字面量快速提升为节点(如 0、true、[0,1,0]),并标记为可变变量。
在顶点位移或法线计算管线中缓存阶段性结果,改善可读性。
如何调整
当传入原始 JS 值时,可用第二个参数 altType 指定目标类型(如 'float'、'vec2'、'vec3'、'color')。若需要强制立即物化为局部变量,可在链尾调用 .toVar('name');若仅需一次性表达式,可直接使用 nodeObject(...)(不带 Intent)。
代码示例
1
2// 以“变量意图”累加一个发光遮罩
3const mask = nodeObjectIntent( float( 0 ) );
4mask.addAssign( noise( uv().mul( 6.0 ) ).mul( 0.6 ) );
5mask.addAssign( time.sin().mul( 0.4 ) );
6
7// 可选:为字面量显式指定类型
8const weight = nodeObjectIntent( 0, 'float' );
9
10material.emissiveNode = color( 0x00ffff ).mul( mask.saturate() );
11