mx_modulo
mx_modulo
MaterialX 兼容的取模/求余函数封装;等价于 TSL 的 mod(in1, in2),逐分量返回 in1 在以 in2 为周期下的剩余;未提供第二参数时默认使用 float(1)。
核心优势
语义与 MaterialX 对齐,直接用于“包裹/重复”计算;默认值安全易用;支持标量与向量并行(逐分量)运算,适合直接对 UV 或颜色通道操作。
常见用途
UV 循环、条纹/分段图案与平铺遮罩的构建
将连续时间映射为 [0,1) 的循环相位(动画循环)
基于区间的分桶/索引(配合 floor/div 实现栅格定位)
生成锯齿/三角波等周期波形的基础相位
如何调整
第二参数 in2 控制周期(建议使用正数并避免为 0);对向量输入可分别为每个分量设置不同周期(如 vec2 用于 U/V 分开控制)。若需要标准化相位可用 mx_modulo(x, p).div(p) 得到 [0,1);当存在负值参与时,其结果遵循 GLSL 的 mod 语义(a - b * floor(a/b)),若希望统一为非负相位可对除数使用 abs(in2)。
代码示例
1// 将 u 坐标分成 10 段并在每段内取 [0,1) 相位
2const phase = mx_modulo( uv().x.mul( 10.0 ), 1.0 );
3
4// 前半段为白,后半段为黑,得到重复条纹
5const stripe = step( 0.5, phase );
6material.colorNode = vec3( stripe );
7
8// 循环计时:把 time 映射到 [0,1) 周期(可用于驱动动画)
9const loop01 = mx_modulo( time, 1.0 );