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) 只保留一个数的方向,丢掉它的大小:
| x | sign(x) |
|---|---|
| -3.2 | -1.0 |
| 0.0 | 0.0 |
| 0.01 | 1.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,拿来做乘法更方便。