简单分形

10 / 18
学习创建简单的分形图案,理解递归和自相似的概念在着色器中的应用。

每次迭代把坐标放大 2 倍再取小数,就能不断产生自相似的细节层次,关键循环是:

下面拆解这个迭代是怎么制造分形的。


放大 + fract = 自相似

每次循环做两件事:

  1. pos *= 2.0 — 把坐标空间放大 2 倍,原来的一个大格子变成 4 个小格子
  2. 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),让每个圆更实心,观察分形图案的密度变化。

GLSL 代码编辑器

正确代码预览

当前代码预览