返回

渐变重映射遮罩

结合 remap() 与 smoothstep(),把线性渐变塑造成更有层次的遮罩与配色效果。

把 x 坐标重映射到 [-1, 1],然后用 abs() 折叠、用 smoothstep 塑形,就能做出以中心为轴的双色渐变:

下面拆解它。


remap 做区间转换

remap(v, inMin, inMax, outMin, outMax) 把一个值从输入区间线性映射到输出区间。

vUv.x 原本是 0–1(左到右)。remap(vUv.x, 0.0, 1.0, -1.0, 1.0) 把它变成 -1–1:

  • 左边 vUv.x = 0 → centered = -1
  • 中心 vUv.x = 0.5 → centered = 0
  • 右边 vUv.x = 1 → centered = +1

这样中心就成了 0,方便做对称构图。


abs 折叠对称

abs(centered) 把负号去掉,让左右两侧对称:

  • 中心 centered = 0 → folded = 0(最小,最近)
  • 左边 centered = -1 → folded = 1(最大,最远)
  • 右边 centered = +1 → folded = 1(和左边一样)

结果是以中心为轴的 V 形渐变——两侧完全镜像。


两层 smoothstep 塑形

centerMask = 1.0 - smoothstep(0.0, 0.45, folded):中心区 folded 小 → mask 大(亮色显现);远离中心 folded 大 → mask 小(外围颜色显现)。

edgeMask = smoothstep(0.15, 0.95, folded):折叠距离越大,边缘衰减效果越强,给画面加一层暗化。

两层叠加后,中心亮、外围渐暗,形成有层次的光晕效果。


试着改一改

改动效果
把 0.45 改成 0.2亮带变窄,中心高光更集中
把 edgeMask * 0.55 改成 edgeMask * 1.0边缘变得更暗
把 centerA 改成 vec3(1.0, 0.5, 0.1)中心从青蓝变成橙色
去掉 color = mix(color, outerColor * 0.65, ...) 那行取消边缘压暗,整体变亮

练习

把 vUv.x 用 remap 映射到 [-1, 1],用 abs() 折叠,再用 smoothstep 构造 centerMask 和 edgeMask。

答案解析

remap 把线性 x 坐标转换成以中心为 0 的对称空间,abs 让左右镜像。centerMask 在中心附近为 1(亮色区),远离中心归 0;edgeMask 越向外越大,用于给外围加一层暗化压制。

练习起始状态 centered = 0.0、folded = 0.0、两层 mask 均为 0,画面只显示外围颜色。补全这四行就能得到完整效果。

试着把 remap 的输出区间改成 [-2.0, 2.0],看看亮带如何变化。

GLSL 代码编辑器

正确代码预览

当前代码预览