GLSL 内置函数

sign()

x 为负数时返回 -1.0,为 0 时返回 0.0,为正数时返回 1.0。

函数签名

float sign(float x)
vec2 sign(vec2 x)
vec3 sign(vec3 x)
vec4 sign(vec4 x)

参数

x
要判断正负的数。传入向量时,每个分量分别计算。

返回值

与 x 类型相同的值,每个分量是 -1.0、0.0 或 1.0。

在线示例

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

工作原理

sign(x) 只保留一个数的方向,丢掉它的大小:

xsign(x)
-3.2-1.0
0.00.0
0.011.0

示例里的灰线是一条平滑的 sin 波,经过 sign 之后,每个值都被压到 -1 或 1,得到绿色的方波。

常见用法

  • 方波和闪烁:sign(sin(u_time)) 会以固定节奏在 -1 和 1 之间切换。
  • 取绝对值后恢复符号:sign(x) * pow(abs(x), 2.0) 对数值平方,但原来是负数的结果仍是负数。
  • 判断在哪一边:sign(p.x) 告诉你像素在左半边(-1)还是右半边(1)。

常见错误

  • 以为只有两种结果。输入正好是 0.0 时返回 0.0,坐标恰好为 0 的地方可能出现一像素的缝。
  • 需要 0/1 遮罩时用了 sign。step(0.0, x) 只返回 0 或 1,拿来做乘法更方便。

相关函数