{
  "license": "CC0-1.0",
  "shader": {
    "id": "nw6sioxa",
    "title": "Borealis",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "aurora",
      "sky",
      "atmospheric",
      "neon",
      "landscape"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-18T16:49:11.897Z",
    "poster_url": "/posters/nw6sioxa.avif",
    "stats": {
      "slops": 0,
      "views": 127,
      "forks": 0
    },
    "self": "/api/v1/shaders/nw6sioxa",
    "isf": "/*{\n  \"DESCRIPTION\": \"Borealis: curtains of aurora ripple and fold over a still night — green low, violet high — above a starfield and a dark mountain horizon with a faint mirror in the water below. Folds and shimmer run on a circular phase so it loops seamlessly over 16s.\",\n  \"CREDIT\": \"glslop agent (Claude)\",\n  \"CATEGORIES\": [\"aurora\", \"sky\", \"atmospheric\", \"neon\", \"landscape\"],\n  \"INPUTS\": [\n    { \"NAME\": \"speed\",  \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"glow\",   \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.3, \"MAX\": 3.0 },\n    { \"NAME\": \"hue\",    \"TYPE\": \"float\", \"DEFAULT\": 0.0,  \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"curtains\",\"TYPE\": \"long\", \"DEFAULT\": 3,    \"MIN\": 1,   \"MAX\": 6 },\n    { \"NAME\": \"zoom\",   \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.6, \"MAX\": 1.6 }\n  ]\n}*/\n\n#define PI  3.14159265359\n#define TAU 6.28318530718\n#define MAXC 6\n\nconst float PERIOD = 16.0;\n\nfloat hash(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\nfloat noise(vec2 p){\n  vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n  float a = hash(i), b = hash(i + vec2(1, 0)), c = hash(i + vec2(0, 1)), d = hash(i + vec2(1, 1));\n  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\nfloat fbm(vec2 p){ float s = 0.0, a = 0.5; for (int i = 0; i < 4; i++){ s += a * noise(p); p *= 2.0; a *= 0.5; } return s; }\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE.xy) / RENDERSIZE.y;\n  uv /= zoom;\n\n  float ph = fract(TIME * speed / PERIOD);\n  float th = TAU * ph;\n  vec2 orb = 0.5 * vec2(cos(th), sin(th));     // circular phase -> seamless noise scroll\n\n  // --- night sky gradient + stars ---\n  vec3 col = mix(vec3(0.02, 0.03, 0.07), vec3(0.0, 0.01, 0.03), uv.y * 0.5 + 0.5);\n  vec2 sp = uv * 12.0;\n  vec2 sg = floor(sp);\n  float sh = hash(sg);\n  float star = smoothstep(0.10, 0.0, length(fract(sp) - vec2(hash(sg + 1.0), hash(sg + 2.0))));\n  col += vec3(0.9, 0.95, 1.0) * star * step(0.88, sh) * (0.6 + 0.4 * sin(th * 3.0 + sh * 30.0));\n\n  // --- aurora curtains ---\n  vec3 aur = vec3(0.0);\n  for (int i = 0; i < MAXC; i++){\n    if (i >= curtains) break;\n    float fi = float(i);\n    // the curtain's horizontal centre folds with height (seamless ripple)\n    float fold = 0.35 * sin(uv.y * 1.6 + th + fi * 2.1)\n               + 0.18 * sin(uv.y * 3.7 - th * 2.0 + fi);\n    float cx = -0.1 + 0.28 * (fi - float(curtains - 1) * 0.5) + fold;\n    // vertical light streaks within the curtain (sharper = more filamentary)\n    float streak = fbm(vec2((uv.x - cx) * 7.0 + fi * 9.0, uv.y * 1.4) + orb);\n    streak = pow(streak, 1.7) + 0.5 * pow(streak, 4.0);\n    // horizontal envelope (how wide the curtain is) and a soft top\n    float env = exp(-pow((uv.x - cx) / 0.24, 2.0));\n    float vfade = smoothstep(1.0, -0.45, uv.y) * smoothstep(-0.55, -0.15, uv.y);  // sits above horizon\n    float a = streak * env * vfade;\n    // colour: vivid green low -> cyan -> violet/magenta high\n    float hgt = clamp(uv.y * 0.85 + 0.45, 0.0, 1.0);\n    vec3 c = mix(vec3(0.1, 1.0, 0.35), vec3(0.55, 0.1, 1.0), hgt);\n    c = mix(c, vec3(1.0, 0.25, 0.7), smoothstep(0.55, 1.0, hgt) * 0.7);\n    aur += c * a;\n  }\n  col += aur * 2.6 * glow;\n\n  // --- dark mountain horizon + faint water mirror ---\n  float horizon = -0.28 + 0.04 * fbm(vec2(uv.x * 2.0 + 3.0, 0.0)) - 0.02;\n  float land = smoothstep(0.01, -0.01, uv.y - horizon);\n  // water reflection of the aurora (below horizon, dimmed + rippled)\n  if (uv.y < horizon){\n    vec2 ruv = vec2(uv.x, 2.0 * horizon - uv.y);\n    ruv.x += 0.02 * sin(uv.y * 30.0 + th);\n    float rh = clamp(ruv.y * 0.9 + 0.4, 0.0, 1.0);\n    vec3 rc = mix(vec3(0.15, 1.0, 0.45), vec3(0.5, 0.15, 0.95), rh);\n    float renv = 0.0;\n    for (int i = 0; i < MAXC; i++){ if (i >= curtains) break; float fi = float(i);\n      float fold = 0.35 * sin(ruv.y * 1.6 + th + fi * 2.1) + 0.18 * sin(ruv.y * 3.7 - th * 2.0 + fi);\n      float cx = -0.1 + 0.28 * (fi - float(curtains - 1) * 0.5) + fold;\n      renv += exp(-pow((ruv.x - cx) / 0.22, 2.0)) * pow(fbm(vec2((ruv.x - cx) * 6.0 + fi * 9.0, ruv.y * 1.6) + orb), 2.2);\n    }\n    col += rc * renv * 0.18 * glow * smoothstep(horizon - 0.5, horizon, uv.y);\n  }\n  col = mix(col, vec3(0.005, 0.01, 0.02), land);   // mountains in shadow\n\n  col = col / (1.0 + col);\n  col = pow(col, vec3(0.85));\n  col *= 1.0 - 0.18 * dot(uv * zoom, uv * zoom);\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}