uniformFlow
uniformFlow
将传入节点及其依赖标记为在“统一控制流”(uniform control-flow)中求值的上下文节点。该包装不会改变数值结果,只影响编译期对控制流一致性的分析,用于满足 WGSL/Metal 等后端对导数与隐式导数采样的校验要求。
核心优势
在条件分支或循环中安全使用 fwidth/dFdx/dFdy 以及可能依赖隐式导数的纹理采样;通过将相关子图提升为 uniform 控制流,消除“not in uniform control flow”类校验错误,同时最小化对现有节点图的改动。
常见用途
为抗锯齿条纹、法线细节等使用 fwidth/dFdx/dFdy 的表达式提供 uniform 控制流。
在分支内进行 texture(...) 等可能依赖隐式导数的采样时,包裹其 UV 或中间计算以满足后端校验。
跨平台修复 WebGPU/WGSL 或 Metal 后端出现的控制流一致性报错。
在复杂节点图中,显式界定应统一执行的子图,以便编译器进行更安全的重排或提升。
如何调整
仅包裹最小必要的子图(通常是导数的被测量信号或采样的 UV),以避免把可被分支裁剪的开销提前执行。若仍出现 uniformity 报错,将 uniformFlow(...) 外移一层,直到错误消失。该节点无参数,移除或移动包装即可调整行为。
代码示例
1// JS:在导数计算前用 uniformFlow 包裹高频信号,得到抗锯齿条纹
2const material = new MeshStandardNodeMaterial();
3
4// 高频条纹信号
5const stripes = sin( uv().x.mul( 40.0 ) );
6
7// 某些后端要求导数在 uniform 控制流中计算
8const edge = fwidth( uniformFlow( stripes ) );
9
10// 抗锯齿遮罩
11const mask = smoothstep( 0.0, edge, abs( stripes ) );
12
13// 以遮罩混合两种颜色
14material.colorNode = mix( color( 0x1565C0 ), color( 0x90CAF9 ), mask );
15
16mesh.material = material;