呼吸暗角
2 / 14
让暗角强度随时间呼吸变化。
一个明亮的中心区域随着时间扩大、收缩,像呼吸时胸腔的起伏。让暗角大小动起来靠这一行:
下面拆解每个部分。
什么是暗角效果
暗角(vignette)是摄影里常见的效果:画面中心亮,四周暗。
实现方式是:计算每个像素到中心的距离 d,然后用 smoothstep 在某个半径处从亮色平滑过渡到暗色。
strength 控制这个过渡发生的位置——strength 越大,亮区越小(暗角收缩);strength 越小,亮区越大(暗角扩展)。
用 sin 让 strength 呼吸
sin(u_time) * 0.25 + 0.55 把正弦输出换算到 0.3~0.8 之间:
- 最低时:
-1.0 * 0.25 + 0.55 = 0.30(亮区最大,几乎全亮) - 最高时:
1.0 * 0.25 + 0.55 = 0.80(亮区最小,只有中心一点点亮)
这样 strength 在 0.3 到 0.8 之间来回变化,暗角的大小也随之呼吸。
smoothstep 的过渡
- 距离小于
strength - 0.15→ 完全亮(1.0) - 距离在
strength - 0.15到strength之间 → 平滑过渡 - 距离大于
strength→ 完全暗(0.0)
过渡区间宽度是 0.15,产生柔和的晕染效果。
试着改一改
| 改动 | 效果 |
|---|---|
* 0.4 + 0.55 | 呼吸幅度更大,变化更剧烈 |
* 0.1 + 0.55 | 呼吸幅度很小,只是轻微起伏 |
sin(u_time * 3.0) | 呼吸频率加快 |
strength - 0.05 | 过渡区更窄,边缘更锐利 |
练习
练习区的暗角大小固定不变,把 float strength = 0.55 改成用 sin(u_time) 计算出来的动态值,让暗角随时间呼吸。
答案解析
sin(u_time)产生 -1.0 到 1.0 的震荡* 0.25控制幅度,变化范围为 ±0.25+ 0.55让strength在 0.3~0.8 之间波动
起始代码里 strength = 0.55 是常量,暗角大小固定。换成动态计算后,每帧的 strength 不同,暗角边界随时间扩缩,呼吸效果出现。
试着把 + 0.55 改成 + 0.7,呼吸的"中心点"移高,大部分时间暗角会更重,只在波谷时变亮。