FBM 分形噪声
7 / 15
学习程序化噪声的基础构件与常见风格化手法。
单层 Value Noise 看起来过于平滑、缺少层次感。FBM(Fractal Brownian Motion)的做法是把多层噪声叠在一起,每一层频率翻倍、幅度减半:
下面看 fbm 内部是怎么做的。
octave 叠加
fbm 循环 4 次,每次叠加一层:
第 1 层(a=0.5):大轮廓,贡献 50% 第 2 层(a=0.25):中等细节,贡献 25% 第 3 层(a=0.125):小细节,贡献 12.5% 第 4 层(a=0.0625):极细纹路,贡献 6.25%
叠加之后既有大起伏,又有细纹路,像真实地形一样有层次。
为什么叫"分形"
每层和上一层的比例关系固定(频率 ×2,幅度 ×0.5),这种自相似的结构就是分形的特征。放大任何一块区域,都会看到和整体相似的细节,就像海岸线或山脉轮廓。
试着改一改
| 改动 | 效果 |
|---|---|
6.0 改成 2.0 | 整体频率降低,起伏更缓 |
i < 4 改成 i < 8 | 叠加更多层,细节更丰富(但更慢) |
a *= 0.5 改成 a *= 0.7 | 高频层贡献更大,纹路更粗糙 |
p *= 2.0 改成 p *= 1.5 | 频率增长变慢,各层更接近 |
练习
在 main 函数里用 fbm(vUv * 6.0) 计算分形噪声,输出灰度图。
答案解析
把 n = 0.0 替换成 n = fbm(vUv * 6.0) 即可。
vUv * 6.0:控制整体频率(基础层的粗细)fbm(...):4 次 octave 叠加,返回有层次感的 0–1 灰度值vec3(n):灰度输出
初始 n = 0.0 是全黑。替换之后你能同时看到大块的明暗起伏和其上叠加的细纹路,比单层 valueNoise 丰富得多。
试着把循环次数从 4 改成 2,感受减少层数后细节的消失。