OnBeforeMaterialUpdate
OnBeforeMaterialUpdate
在 TSL 函数(Fn)作用域内注册一个“材质更新前”的生命周期事件。每次材质开始更新时都会调用给定的回调,用于在 GPU 计算之前从 JavaScript 同步或调整节点与 uniform 的值。
核心优势
提供原生、可组合的材质生命周期钩子。无需手写渲染循环或 onBeforeCompile,即可在正确的时机更新 uniform/属性,并与 Fn 作用域绑定避免全局副作用与重复注册。
常见用途
每帧在更新开始前写入 uniform(如时间、鼠标、GUI 数值)以驱动动画
在切换贴图或节点分支前重置/同步状态,避免一帧内读写竞态
在材料更新前更新缓存数据(如缓冲区内容、颜色表索引)
按条件启用/禁用某段节点逻辑(通过布尔 uniform 开关)
如何调整
该节点本身无可调参数,效果由回调逻辑决定:在回调中修改哪些 .value 或材质属性,就会影响后续这一帧的着色结果。建议只更新数值,避免在回调里每帧创建新节点;用 Fn(...).call() 注册一次即可,若需停用,可在回调中加布尔 uniform 条件分支控制。
代码示例
1// 1) 创建一个将被事件更新的时间 uniform
2const uTime = uniform( 0 );
3
4// 2) 在 Fn 作用域里注册“材质更新前”事件;调用一次完成挂载
5Fn( () => {
6 OnBeforeMaterialUpdate( () => {
7 // 在每次材质更新开始前执行:从 JS 写入最新数值
8 uTime.value = performance.now() * 0.001;
9 } );
10} ).call();
11
12// 3) 使用被事件驱动的 uTime 构造一个脉动发光
13const pulse = sin( uTime.mul( 2.0 ) ).mul( 0.5 ).add( 0.5 );
14material.emissiveNode = vec3( pulse );