GLSL 内置函数
fract()
返回 x 的小数部分,等于 x - floor(x),结果总在 0.0 到 1.0 之间。
函数签名
float fract(float x)
vec2 fract(vec2 x)
vec3 fract(vec3 x)
vec4 fract(vec4 x)参数
- x
- 要取小数部分的数。传入向量时,每个分量分别计算。
返回值
与 x 类型相同的值,每个分量在 [0.0, 1.0) 范围内。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
fract(x) 只保留小数点后面的部分:
fract(2.75)是0.75fract(3.0)是0.0fract(-0.25)是0.75(因为它等于x - floor(x),而floor(-0.25)是-1.0)
关键在于先放大。uv 在整个画布上只从 0 走到 1 一次;uv * 5.0 从 0 走到 5,fract 每越过一个整数就重新从 0 开始。于是 0 到 1 的范围重复了五次,示例里就是 5 x 5 的渐变格子。
常见用法
- 平铺重复:
fract(uv * n)让每一格都有自己的 0 到 1 局部坐标,同一个图形就能铺满画布。 - 循环动画:
fract(u_time * 0.5)每两秒从 0 涨到 1,再跳回 0。 - 哈希随机:
fract(sin(x) * 43758.5453)是经典的一行伪随机数写法。
常见错误
- 忘了从接近 1 跳回 0 是一条硬边。需要平滑循环时,用
sin,或用abs(fract(x) * 2.0 - 1.0)得到三角波。 fract和floor用了不同的缩放系数。格子编号是floor(uv * n),格内坐标是fract(uv * n),两处的 n 必须相同。