移动渐变

4 / 14
通过随时间平移 vUv.x 让渐变动起来。

画面里从左到右的渐变在不停地向右滚动。让它动起来就靠这一行:

下面拆解每个部分。


fract 是什么

fract(x) 取一个数的小数部分,整数部分扔掉。比如:

  • fract(0.3) → 0.3
  • fract(1.7) → 0.7
  • fract(2.0) → 0.0

它的效果是:无论输入值多大,输出永远在 0.0 到 1.0 之间,并且循环。就像时钟到 12 点重新从 0 开始。


加上 u_time 让渐变动起来

vUv.x 是像素的横坐标,范围 0.0 到 1.0(左到右)。

u_time * 0.2 随时间增长。把它加到 vUv.x 上,再取 fract,就相当于把整个渐变向右推移——当值超过 1.0 被 fract 截断后,右边的内容从左边重新出现,形成无缝滚动。

0.2 控制速度:数字越大,滚动越快。


渐变如何生成

mix(A, B, t) 在颜色 A 和颜色 B 之间线性插值:

  • t = 0.0 → 100% 是 A(深灰)
  • t = 0.5 → 50% A + 50% B(中间色)
  • t = 1.0 → 100% 是 B(近白色)

t 就是那个随时间滚动的值,所以渐变也跟着动。


试着改一改

改动效果
u_time * 0.5滚动速度变快
-u_time * 0.2渐变向左滚动
vUv.y + u_time * 0.2渐变从上往下滚动
vUv.x * 2.0 + u_time * 0.2渐变重复两次,滚动更紧密

练习

练习区的渐变是静止的,把 float t = vUv.x 改成使用 fractu_time,让渐变向右滚动起来。

答案解析

  • vUv.x 是每个像素的横向位置
  • + u_time * 0.2 随时间推移横向坐标
  • fract(...) 把超过 1.0 的部分折回到 0.0,实现无缝循环

起始代码里 t = vUv.x,渐变是静止的。加入 fractu_time 后,每一帧的 t 值都在整体平移,渐变就开始滚动。

试着把 0.2 改成 1.0,速度会快很多,渐变会明显地扫过画面。

GLSL 代码编辑器

正确代码预览

当前代码预览