replaceDefaultUV
replaceDefaultUV
replaceDefaultUV 用于在一个上下文中统一替换所有“默认 UV”的使用方式。它不会直接修改纹理节点本身,而是通过 Context 把纹理采样时使用的默认 UV(例如 uv())替换为你在回调中返回的新坐标。
核心优势
可以在不逐一改动每个纹理节点、也不改模型顶点属性的前提下,对整份材质里所有使用默认 UV 的纹理进行统一控制(缩放、平移、旋转、动画、切换到其他坐标系等),从而把“UV 逻辑”抽离成一个可复用、可集中调试的节点。
常见用途
为整份材质添加统一的 UV 平移 / 旋转 / 缩放动画(例如贴图整体滚动、旋转)而不修改每个 texture(...) 调用。
把所有使用默认 UV 的纹理切换到另一套坐标(如用屏幕空间 UV、极坐标 UV 等),快速尝试不同投影方式。
根据不同纹理节点(callback 里的 textureNode)返回不同 UV,从而在同一材质中为颜色贴图、法线贴图等定义各自的 UV 规则。
如何调整
replaceDefaultUV 的核心调节点在于回调函数:你接收一个 textureNode,并返回任意 vec2 类型的 UV 表达式。只要纹理调用依赖的是“默认 UV”,就会被这个上下文接管。你可以在回调中对 uv() 进行缩放、平移、旋转、镜像,或者组合 time、positionWorld、screenUV 等节点构造更复杂的投影;也可以根据 textureNode 分支,给不同纹理返回不同 UV。要启用或关闭该效果,只需在材质上设置或清除 material.contextNode。注意:显式传入自定义 UV 的 texture(...) 调用通常不会被这类默认 UV 替换逻辑影响。
代码示例
1// 为材质挂一个上下文:把所有默认 UV 换成“滚动 UV”
2material.contextNode = replaceDefaultUV( ( textureNode ) => {
3 // 默认 UV
4 const baseUV = uv();
5
6 // 让 UV 在 U 方向随时间滚动
7 const t = time.mul( 0.1 );
8 const scrollUV = baseUV.add( vec2( t, 0.0 ) );
9
10 // 返回新的 UV(会替换默认 UV)
11 return scrollUV;
12} );