GLSL 内置函数

step()

x 小于 edge 时返回 0.0,否则返回 1.0。相当于在阈值处的一个硬开关。

函数签名

float step(float edge, float x)
vec2 step(vec2 edge, vec2 x)
vec2 step(float edge, vec2 x)
vec3 step(vec3 edge, vec3 x)
vec3 step(float edge, vec3 x)

参数

edge
阈值。注意它是第一个参数。
x
与阈值比较的值。

返回值

每个分量为 0.0 或 1.0。

在线示例

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

工作原理

step(edge, x) 比较两个数,用 0 或 1 回答:

step(0.5, 0.2) // 0.0,因为 0.2 < 0.5
step(0.5, 0.8) // 1.0
step(0.5, 0.5) // 1.0,相等算作"不小于"

没有中间值,所以边缘是完全锐利的。示例的背景在一条移动的分界线处从暗突变到亮。

矩形在每个方向各用了两次 step。step(0.3, uv) 在 0.3 的右侧/上方为 1,step(uv, 0.7) 在 0.7 的左侧/下方为 1,两者相乘后只保留同时满足的区域。

常见用法

  • 遮罩:得到 0/1 的值,拿去和颜色相乘,或传给 mix。
  • 代替 if 语句:用 color = mix(a, b, step(0.5, uv.x)) 代替分支判断。
  • 从距离得到图形:step(length(p), 0.5) 在半径 0.5 的圆内为 1。

常见错误

  • 参数顺序写反,这是最常见的错误。阈值在前:step(edge, x)。写成 step(uv.x, 0.5) 结果会反过来。
  • 锯齿。边缘只有一个像素宽,斜边和曲线会出现锯齿。需要抗锯齿时,用宽度很小的 smoothstep。

相关函数

用到 step() 的教程