GLSL 内置函数
clamp()
把 x 限制在 minVal 和 maxVal 之间,等于 min(max(x, minVal), maxVal)。
函数签名
float clamp(float x, float minVal, float maxVal)
vec2 clamp(vec2 x, float minVal, float maxVal)
vec3 clamp(vec3 x, float minVal, float maxVal)
vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal)参数
- x
- 要限制的值。
- minVal
- 下限,比它小的值会变成 minVal。
- maxVal
- 上限,比它大的值会变成 maxVal。必须大于等于 minVal。
返回值
x 在范围内时返回 x,否则返回离它最近的边界值。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
clamp(x, minVal, maxVal) 把 x 限制在一个区间里:
- 小于
minVal:返回minVal - 大于
maxVal:返回maxVal - 在两者之间:原样返回 x
示例中灰色斜线是原始值。绿线在中间与它重合,到了上下限就变成水平线。上下限会随 u_time 一张一缩。
常见用法
- 保证颜色有效:写入
gl_FragColor前先clamp(color, 0.0, 1.0)。 - 给其他函数安全的输入:
sqrt(clamp(x, 0.0, 1.0))、acos(clamp(d, -1.0, 1.0))可以避免越界输入导致结果未定义。 - 进度条:
clamp((u_time - start) / duration, 0.0, 1.0)从 0 走到 1,之后一直停在 1。
常见错误
- 上下限写反。
minVal大于maxVal时,GLSL 规定结果未定义,不同 GPU 表现不同。 - 期待平滑过渡。
clamp两端是硬拐角,需要缓入缓出的曲线时用smoothstep。