رفتن به محتواCREATIVE·CODE·ART
1
1
1
1
1
1
1
GLSL shader

Spiral Bloom

Spiral Bloom is a living flower of light written entirely in GLSL. Layered petals twist along a spiral and breathe in opposite directions, while a core of seeds follows the golden angle, the same pattern found in sunflowers. Every pixel is computed on the GPU in real time. Use the sliders to change petals, layers, twist, glow, and hue, and watch it shift from a calm blossom to a swirling vortex.

مجوز: CC BY-NC-SA 4.0: ریمیکس با ذکر نام، غیرتجاری، با همین مجوز

دیدن کد
precision highp float;
uniform float u_time;
uniform vec2 u_resolution;
uniform float u_speed;
uniform float u_petals;
uniform float u_layers;
uniform float u_twist;
uniform float u_glow;
uniform float u_hue;
uniform float u_zoom;

// پالت رنگی کسینوسی
vec3 pal(float t, float h) {
  return 0.5 + 0.5 * cos(6.28318 * (t + vec3(0.0, 0.33, 0.67) + h));
}

void main() {
  // اگر اسلایدرها ساخته نشده‌اند، مقدارهای پیش‌فرض استفاده می‌شود
  bool none = abs(u_petals) + abs(u_layers) + abs(u_glow) + abs(u_zoom) < 0.01;
  float speed  = (none && u_speed < 0.001) ? 1.0 : u_speed;
  float petals = none ? 7.0 : u_petals;
  float layers = none ? 4.0 : u_layers;
  float twist  = none ? 2.5 : u_twist;
  float glow   = none ? 1.2 : u_glow;
  float zoom   = none ? 1.0 : max(u_zoom, 0.2);
  float hue    = none ? 0.0 : u_hue;

  vec2 uv = (gl_FragCoord.xy - 0.5 * u_resolution) / min(u_resolution.x, u_resolution.y) * 2.0;
  uv /= zoom;
  float t = u_time * speed;
  float r = length(uv);
  float a = atan(uv.y, uv.x);

  vec3 col = vec3(0.0);

  // ---------- لایه‌های گلبرگ ----------
  for (int i = 0; i < 6; i++) {
    if (float(i) >= layers) break;
    float fi = float(i);

    float s = 0.95 - fi * 0.14;
    float dir = mod(fi, 2.0) * 2.0 - 1.0;

    // پیچش مارپیچی: زاویه با فاصله از مرکز تغییر می‌کند
    float aa = a + twist * r * (1.0 - 0.15 * fi) + fi * 2.39996 + t * (0.15 + 0.08 * fi) * dir;

    float pet = 0.5 + 0.5 * cos(petals * aa);
    float R = s * (0.22 + 0.78 * pow(pet, 1.4));
    R *= 0.94 + 0.06 * sin(t * 1.5 + fi * 1.7);   // تنفس

    float edge = abs(r - R * 0.92);
    float line = pow(0.010 / (edge + 0.004), 1.25);
    float fill = smoothstep(R, 0.0, r) * 0.10 * pet;

    vec3 c = pal(fi * 0.17 + r * 0.5 + t * 0.04, hue);
    col += c * (line * 0.30 + fill);
  }

  // ---------- هسته: دانه‌های آرایش طلایی ----------
  if (r < 0.52) {
    float c0 = 0.03;
    float n0 = floor((r / c0) * (r / c0));
    float seeds = 0.0;
    vec3 seedCol = vec3(0.0);
    for (int j = -14; j <= 14; j++) {
      float n = n0 + float(j);
      if (n < 0.0) continue;
      float rr = c0 * sqrt(n);
      float ang = n * 2.39996323 + t * 0.2;
      vec2 p = rr * vec2(cos(ang), sin(ang));
      float dd = length(uv - p);
      float rad = c0 * (0.28 + 0.1 * sin(t * 2.0 + n * 0.3));
      float k = smoothstep(rad, 0.0, dd);
      if (k > seeds) {
        seeds = k;
        seedCol = pal(n * 0.004 + 0.1, hue);
      }
    }
    col += seedCol * seeds * 1.3;
  }

  // درخشش مرکز
  col += pal(t * 0.05, hue) * 0.015 / (r + 0.03);

  // تون‌مپ نرم و محو شدن لبه‌ها
  col = 1.0 - exp(-col * glow * 1.4);
  col *= 1.0 - 0.35 * smoothstep(0.6, 1.4, r);

  gl_FragColor = vec4(col, 1.0);
}