脊状噪声
9 / 15
学习程序化噪声的基础构件与常见风格化手法。
普通 FBM 的高亮区域是圆顶形的丘陵,脊状噪声把这些圆顶"翻转"成尖峰,低处反而变平坦:
下面拆解这个变换。
abs(n * 2.0 - 1.0) 做了什么
先看括号里的步骤:
n * 2.0 - 1.0:把 0–1 的噪声重新映射到 -1 到 1abs(...):取绝对值,-1 到 1 变成 0 到 1,但原本靠近 0 的中间段(对应噪声 50% 附近)被折叠到最低点
加上最外面的 1.0 - ...:原来的低点变高点,高点变低点。效果是:
- 噪声值接近 0% 或 100%(极端值)→ 变成 0(暗谷)
- 噪声值接近 50%(中间值)→ 变成 1(亮峰)
这就是"脊"的感觉——峰值尖锐,谷地宽阔。
和湍流噪声的对比
湍流噪声用 abs(n * 2.0 - 1.0)(不取反),结果是:中间值变暗谷,极端值变亮峰。
脊状噪声用 1.0 - abs(n * 2.0 - 1.0)(取反),结果刚好相反。
两者都是对噪声的数学折叠,只差一个"反转"。
试着改一改
| 改动 | 效果 |
|---|---|
6.0 改成 3.0 | 脊线变稀疏、更宽 |
6.0 改成 12.0 | 脊线密集,像细细的发丝 |
把 1.0 - 去掉 | 变成湍流噪声,高低关系翻转 |
在外面套上颜色:mix(dark, bright, n) | 脊线发光感 |
练习
在 main 函数里,对 fbm(vUv * 6.0) 的结果应用 n = 1.0 - abs(n * 2.0 - 1.0),输出脊状噪声。
答案解析
在 float n = fbm(...) 之后加一行 n = 1.0 - abs(n * 2.0 - 1.0)。
n * 2.0 - 1.0:把 [0,1] 拉伸到 [-1,1]abs(...):把负数折叠回正数,中间段塌陷成谷底1.0 - ...:整体翻转,谷底变峰顶
初始代码只有 n = fbm(...) 是普通分形噪声,圆顶丘陵形态。加上这行变换,丘顶被压平、谷底被提拔,整体变成尖锐的脊线网格。
试着把 2.0 改成 4.0,脊线会变得更加尖锐密集。