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。