柔边渐隐

8 / 18
使用 smoothstep() 实现图形边缘的渐隐过渡,对比 step()。

核心是用 smoothstep 把到中心的距离变成一个从亮到暗的遮罩:

下面拆解它。


distance 函数

distance(a, b) 计算两点之间的直线距离,等同于 length(a - b)

distance(vUv, vec2(0.5)) 算出当前像素到画面中心的距离:

  • 中心像素:distance = 0
  • 角落像素:distance ≈ 0.707

smoothstep 做软边

smoothstep(0.3, 0.5, dist) 把距离映射成遮罩值:

  • dist < 0.3(中心区域)→ 遮罩 = 0(100% 显示前景色)
  • dist 在 0.3 到 0.5 之间 → 遮罩从 0 平滑过渡到 1
  • dist > 0.5(外围)→ 遮罩 = 1(100% 显示背景色黑色)

这两个参数 0.30.5 就是柔化过渡带的内边缘和外边缘。


mix 混色

mix(colorA, colorB, t) 按照 t 的比例在两个颜色之间混合:

  • t = 0 → 100% 取 colorA(黄色中心)
  • t = 1 → 100% 取 colorB(黑色外围)
  • t = 0.5 → 各取一半

这里 colorA 是 vec3(1.0, 0.8, 0.2)(暖黄色),colorB 是 vec3(0.0)(黑色),遮罩 mask 就是 t。


试着改一改

改动效果
0.3 改成 0.1柔化过渡带移向中心,亮区更小
0.5 改成 0.35过渡带变窄,边缘更锐利
vec3(0.0) 改成 vec3(0.1, 0.0, 0.2)外围变成深紫色背景
把两个参数对调变成 smoothstep(0.5, 0.3, dist)遮罩翻转,中心变暗

练习

计算到中心的距离 dist,用 smoothstep(0.3, 0.5, dist) 生成遮罩,再用 mix 混合黄色和黑色输出。

答案解析

distance(vUv, vec2(0.5)) 算出每个像素到中心的距离。smoothstep(0.3, 0.5, dist) 在半径 0.3 到 0.5 之间制造柔和过渡,内部为 0(透明遮罩),外部为 1(不透明遮罩)。mix 把遮罩作为 t 值混合黄色和黑色,中心显示黄色、边缘渐渐变黑。

练习起始状态是空的 main(),无任何输出。按上述步骤补全后就能看到带柔边的圆形光晕。

试着把 vec3(1.0, 0.8, 0.2) 换成 vec3(0.3, 0.8, 1.0)(青蓝色),看看颜色变化。

GLSL 代码编辑器

正确代码预览

当前代码预览