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.75
  • fract(3.0) 是 0.0
  • fract(-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 必须相同。

相关函数

用到 fract() 的教程