GLSL 内置函数

abs()

返回 x 的绝对值:负数变成正数,正数保持不变。

函数签名

float abs(float x)
vec2 abs(vec2 x)
vec3 abs(vec3 x)
vec4 abs(vec4 x)

参数

x
要取绝对值的数。传入向量时,每个分量分别计算。

返回值

与 x 类型相同的值,每个分量都大于等于 0。

在线示例

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

工作原理

abs(x) 会去掉负号。abs(-0.7) 是 0.7,abs(0.7) 也是 0.7。

在以画布中心为原点的坐标里(p 从 -1 到 1),abs(p.x) 在中间是 0,越往左右两边越大。原本一条斜坡就变成了 V 字形,示例画出的正是这个 V。

float y = abs(p.x); // 左边缘 1.0,中心 0.0,右边缘 1.0

常见用法

  • 镜像对称:abs(p.x) 把画布左半边折到右半边,画一个图形会同时出现两份。
  • 到直线的距离:abs(p.y - 0.3) 就是像素到水平线 y = 0.3 的距离。
  • 方形轮廓:max(abs(p.x), abs(p.y)) 得到正方形等值线,是矩形 SDF 的基础。

常见错误

  • 在 GLSL ES 1.0 里对整数用 abs:要写 abs(-1.0) 而不是 abs(-1),因为没有整数版本。
  • 没有先把坐标移到中心。uv 本身在 0 到 1 之间,全是正数,abs(uv.x) 不会有任何变化。

相关函数

用到 abs() 的教程