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,看看高光端被截断后的变化。

GLSL 代码编辑器

正确代码预览

当前代码预览