Sin/Cos 曲线

5 / 18
练习着色器中常用的数学基础积木。

sin() 函数能把一个随时间变化的数值变成「来回摇摆」的运动。把它用在 y 坐标上,就能画出流动的波浪线:


sin() 输出什么

sin() 的返回值在 −1 到 +1 之间循环变化。直接用这个值做坐标会超出画布范围,所以需要缩放和偏移:

  • * 0.25:把振幅从 ±1 压缩到 ±0.25,波浪不会碰到边缘
  • + 0.5:把中心线从 0 移到画布正中(UV 的 0.5)

x * 6.2831853 是什么

6.2831853 就是 2π,表示「一整圈」。把 vUv.x(0 到 1)乘以 2π,波形在画布横向恰好完成一个完整周期。想要更密的波浪就乘更大的数,比如 12.566(4π)会出现两个周期。


+ u_time 让波动起来

u_time 是不断增大的时间值。加在 sin() 的参数里,相当于每帧都在「推动」波形向左移动,形成动画效果。


如何把 y 变成一条线

知道波形上每一点的 y 值之后,用当前像素的 vUv.y 减去它,取绝对值得到「距离」,再用 smoothstep 把距离映射成亮度:

smoothstep(0.0, 0.01, d) 在距离 0–0.01 之间从 0 过渡到 1,用 1.0 - 反转后,距离为 0 的地方亮度最高(白色),远处为 0(背景色)。


试着改一改

改动效果
6.2831853 改为 18.849出现三个周期的密集波浪
0.25 改为 0.45波浪幅度增大,几乎触及上下边缘
0.01 改为 0.05线条变粗,边缘更模糊
u_time 改为 u_time * 3.0波浪流动速度加快

练习

float y = 0.5; 替换为正确的正弦波计算,让一条蓝色波浪线在画布上流动。

答案解析

初始状态:y = 0.5 是一条固定的水平线,不随 x 变化,也不会动。

修改后:vUv.x * 6.2831853 让波形在横向走完一个完整的正弦周期;+ u_time 让相位随时间偏移,形成向左流动的动画;* 0.25 + 0.5 把 sin() 的 ±1 范围压缩并居中到画布的中间区域。

试着把 * 0.25 改为 * 0.48,体验波峰几乎碰到画布顶部的极限感。

GLSL 代码编辑器

正确代码预览

当前代码预览