Clamp 与饱和
2 / 18
练习着色器中常用的数学基础积木。
核心就是这一行——把超出范围的值截断:
下面拆解它。
clamp 是什么
clamp(x, min, max) 的意思是:把 x 限制在 min 到 max 之间,超出就截断。
- x 比 min 小,就返回 min
- x 比 max 大,就返回 max
- x 在中间,就原样返回
类比:你有一个音量旋钮,最小 0%,最大 100%。拧过头了,它也只停在 100%,不会再大。
这段代码做了什么
vUv.x * 1.8 - 0.4 先对 x 坐标做了一个线性变换——放大并左移,使渐变在画面偏左就开始、偏右就结束。
没有 clamp,x 接近 1.0 时计算结果会超过 1.0,边缘溢出变成死白;x 接近 0.0 时结果为负,变成死黑。
加了 clamp(…, 0.0, 1.0) 之后,左边强制是纯黑,右边强制是纯白,中间是平滑过渡。
试着改一改
| 改动 | 效果 |
|---|---|
把 1.8 改成 4.0 | 渐变区间变短,大部分画面非黑即白 |
把 -0.4 改成 0.0 | 渐变从左边界开始,右侧更快到白 |
把上限 1.0 改成 0.6 | 最亮只到 60%,画面没有纯白 |
把下限 0.0 改成 0.3 | 最暗只到 30%,画面没有纯黑 |
练习
用 clamp 把表达式 vUv.x * 1.8 - 0.4 限制在 0.0 到 1.0 之间,赋值给 t。
答案解析
vUv.x * 1.8 - 0.4 是线性变换,把 x 坐标拉伸并左移,让渐变过渡区间收缩在画面中部。加上 clamp(…, 0.0, 1.0) 后,超出范围的部分被截断,两端成为纯黑和纯白。
练习的起始状态是 float t = 0.0,画面全黑。替换成 clamp(vUv.x * 1.8 - 0.4, 0.0, 1.0) 就还原了渐变。
试着把上限 1.0 改成 0.7,看看高光端被截断后的变化。