呼吸色块

6 / 14
使用 sin() 函数和时间变量实现周期变化的颜色呼吸动画。

整个画面的颜色随时间轻轻地由暗到亮、再由亮到暗,像呼吸一样。核心是这两行:

下面拆解每个部分。


生成呼吸亮度

sin(u_time) 在 -1.0 到 1.0 之间震荡。

0.5 + 0.5 * sin(u_time) 把它换算到 0.0~1.0:

  • 最低时:0.5 + 0.5 * (-1.0) = 0.0(全暗)
  • 居中时:0.5 + 0.5 * 0.0 = 0.5(半亮)
  • 最高时:0.5 + 0.5 * 1.0 = 1.0(全亮)

这个 brightness 就是红色通道的值,它随时间反复从 0% 到 100%。


固定绿蓝,只让红变化

绿色固定在 60%,蓝色固定在 90%。只有红色在动。

当红色处于低位时,画面偏冷(蓝绿为主);红色处于高位时,画面变暖(带红的紫色调)。整体颜色在冷暖之间呼吸。


试着改一改

改动效果
sin(u_time * 2.0)呼吸速度加倍
0.3 + 0.7 * sin(u_time)暗部更深,对比更强
vec3(0.9, brightness, 0.6)绿色通道在呼吸
vec3(brightness, brightness, brightness)纯灰度呼吸

练习

练习区的画面是空的,用 sin(u_time) 生成亮度因子,构建一个红色通道随时间呼吸变化的彩色块。

答案解析

  • 0.5 + 0.5 * sin(u_time) 把正弦波换算到 0.0–1.0 范围
  • vec3(brightness, 0.6, 0.9) 只让红色通道变动,绿蓝保持固定
  • vec4(color, 1.0) 输出到屏幕

起始代码的 main() 是空的,什么都不输出。填入这三行后,每帧计算出不同的 brightness,颜色就开始呼吸。

试着把 0.6 也换成 sin(u_time + 1.0) * 0.5 + 0.5,让绿色同步但相位不同地呼吸,颜色变化会更丰富。

GLSL 代码编辑器

正确代码预览

当前代码预览