呼吸色块
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,让绿色同步但相位不同地呼吸,颜色变化会更丰富。