把 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],看看亮带如何变化。