呼吸暗角

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.15strength 之间 → 平滑过渡
  • 距离大于 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.55strength 在 0.3~0.8 之间波动

起始代码里 strength = 0.55 是常量,暗角大小固定。换成动态计算后,每帧的 strength 不同,暗角边界随时间扩缩,呼吸效果出现。

试着把 + 0.55 改成 + 0.7,呼吸的"中心点"移高,大部分时间暗角会更重,只在波谷时变亮。

GLSL 代码编辑器

正确代码预览

当前代码预览