GLSL 内置函数

mod()

返回 x 对 y 取模的结果,等于 x - y * floor(x / y),即 x 除以 y 的余数。

函数签名

float mod(float x, float y)
vec2 mod(vec2 x, float y)
vec2 mod(vec2 x, vec2 y)
vec3 mod(vec3 x, float y)
vec3 mod(vec3 x, vec3 y)

参数

x
被取模的数。
y
周期。结果每隔 y 重复一次,不能为 0。

返回值

与 x 类型相同的值。y 为正数时结果在 [0, y) 范围内。

在线示例

修改右侧代码,左侧预览会实时更新。

工作原理

mod(x, y) 把 x 折回到长度为 y 的重复区间里:

  • mod(7.0, 3.0) 是 1.0
  • mod(6.0, 3.0) 是 0.0
  • mod(-1.0, 3.0) 是 2.0

它的定义是 x - y * floor(x / y),所以 mod(x, 1.0) 和 fract(x) 完全一样。区别是 mod 可以自己指定周期。

示例里的棋盘格把每个格子的列号和行号相加。相邻格子的和总是相差 1,所以 mod(和, 2.0) 在 0 和 1 之间交替。

常见用法

  • 棋盘格和交替条纹:mod(floor(uv.x * n), 2.0)。
  • 让时间保持在小范围:mod(u_time, 6.2831) 避免传给 sin 的数无限增大,减少移动端 GPU 的精度问题。
  • 空间重复:在光线步进里用 mod(p, 2.0) - 1.0 让物体每隔 2 个单位重复一次。

常见错误

  • 以为负数结果和 C 语言的 % 一样。GLSL 中 mod(-1.0, 3.0) 是 2.0 而不是 -1.0,做平铺时这通常正是想要的。
  • 对浮点数用 %。GLSL ES 1.0 没有 % 运算符,必须调用 mod。
  • 传入整数:要写 mod(x, 2.0),不是 mod(x, 2)。

相关函数

用到 mod() 的教程