简单分形
10 / 18
学习创建简单的分形图案,理解递归和自相似的概念在着色器中的应用。
每次迭代把坐标放大 2 倍再取小数,就能不断产生自相似的细节层次,关键循环是:
下面拆解这个迭代是怎么制造分形的。
放大 + fract = 自相似
每次循环做两件事:
pos *= 2.0— 把坐标空间放大 2 倍,原来的一个大格子变成 4 个小格子pos = fract(pos) - 0.5— 取小数部分并重新居中,每个格子都重置为 [-0.5, 0.5] 的独立小空间
放大一次,坐标空间里出现更小的相同图案。放大四次,就有四个尺度的相同图案叠加在一起,看起来无限细节向下延伸——这就是分形的本质。
权重递减
第一次迭代权重 1/2(50%),第二次 1/4(25%),第三次 1/8(12.5%),第四次 1/16(6.25%)。大尺度的圆圈贡献最多,细节层次贡献递减,所以整体轮廓清晰,细节丰富但不淹没主体。
动态脉冲
用 sin(时间 + 距中心距离) 添加随时间变化的波纹,让静态图案有了生命感。
试着改一改
| 改动 | 效果 |
|---|---|
| 把循环次数从 4 改为 2 | 细节减少,图案更粗糙 |
| 把循环次数改为 6 | 更多层次,细节更丰富 |
把 pow(2.0, ...) 改为 pow(1.5, ...) | 细节层权重更高,细节更突出 |
把 2.0 放大倍率改为 3.0 | 每次放大更多,图案密度更高 |
练习
练习代码中循环结构和圆形已经写好,但初始振幅未设定。在循环开始前把初始振幅设为 0.5,让分形图案正确显示。
答案解析
练习的起始状态是 pattern = 0.0 且缺少迭代累加,画面没有任何图案。
每次迭代对坐标做放大+fract+居中,相当于把画布无限细分。circle / pow(2.0, float(i+1)) 保证每层贡献随尺度缩小而递减:最大的圆主导整体,最小的圆只是精细纹理。四次迭代叠加后,pattern 在有圆圈的地方接近 1,空白处接近 0。
试着把 smoothstep(0.1, 0.3, dist) 改为 smoothstep(0.05, 0.25, dist),让每个圆更实心,观察分形图案的密度变化。