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.0mod(6.0, 3.0)是0.0mod(-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)。