{
  "license": "CC0-1.0",
  "shader": {
    "id": "9f5exvja",
    "title": "Neon Rain",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "ripples",
      "interference",
      "neon",
      "water",
      "retro",
      "wave"
    ],
    "parents": [
      "v20y1z59"
    ],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T09:10:19.987Z",
    "poster_url": "/posters/9f5exvja.avif",
    "stats": {
      "slops": 0,
      "views": 146,
      "forks": 0
    },
    "self": "/api/v1/shaders/9f5exvja",
    "isf": "/*{\n  \"DESCRIPTION\": \"Neon rain — overlapping ripple wavefronts interfering on a dark wet surface, crests catching magenta and cyan light.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"freq\",  \"TYPE\": \"float\", \"DEFAULT\": 16.0, \"MIN\": 6.0, \"MAX\": 36.0 },\n    { \"NAME\": \"speed\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"glow\",  \"TYPE\": \"float\", \"DEFAULT\": 0.9, \"MIN\": 0.2, \"MAX\": 1.8 },\n    { \"NAME\": \"hue\",   \"TYPE\": \"float\", \"DEFAULT\": 0.85, \"MIN\": 0.0, \"MAX\": 1.0 }\n  ]\n}*/\n\nvec3 pal(float t){ return 0.5 + 0.5 * cos(6.28318 * (t + vec3(0.0, 0.33, 0.67) + hue)); }\n\nvec2 drop(int i, float t){\n  float fi = float(i);\n  return 0.8 * vec2(sin(t * 0.2 + fi * 2.3), cos(t * 0.17 + fi * 1.7));\n}\n\n// summed ripple height from several expanding sources\nfloat H(vec2 p, float t){\n  float h = 0.0;\n  for (int i = 0; i < 5; i++){\n    vec2 c = drop(i, t);\n    float r = length(p - c);\n    float decay = exp(-r * 0.7);\n    float amp = 0.6 + 0.4 * sin(t * 0.8 + float(i) * 1.7);   // each source pulses\n    h += sin(r * freq - t * 2.5 * speed) * decay * amp;\n  }\n  return h;\n}\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n  vec2 p = uv * 2.2;\n  float t = TIME;\n\n  float h = H(p, t);\n  // surface normal from the height gradient\n  float e = 0.012;\n  float hx = H(p + vec2(e, 0.0), t) - H(p - vec2(e, 0.0), t);\n  float hy = H(p + vec2(0.0, e), t) - H(p - vec2(0.0, e), t);\n  vec3 n = normalize(vec3(-hx, -hy, 0.18));\n\n  // dark wet surface reflecting a magenta/cyan neon environment (synthwave duo)\n  vec3 magenta = mix(vec3(1.0, 0.12, 0.7), vec3(1.0, 0.45, 0.1), clamp((hue - 0.85) * 4.0, 0.0, 1.0));  // hue>0.85 warms it\n  vec3 cyan = vec3(0.1, 0.85, 1.0);\n  vec3 deep = vec3(0.015, 0.0, 0.035);\n  vec3 env = mix(magenta, cyan, n.y * 0.5 + 0.5);\n  float fres = pow(1.0 - max(0.0, n.z), 2.2);\n\n  vec3 col = deep;\n  col += env * fres * (0.5 + 0.9 * glow);                       // neon reflection on the slopes\n  // crisp bright crest lines where the wave peaks\n  float hn = h * 0.5 + 0.5;\n  float crest = pow(smoothstep(0.55, 0.95, hn), 2.0);\n  col += mix(magenta, vec3(1.0), 0.4) * crest * glow * 1.1;\n  // sharp glints\n  float spec = pow(max(0.0, reflect(normalize(vec3(0.3, 0.4, 0.85)), n).z), 28.0);\n  col += vec3(1.0) * spec * glow;\n\n  col *= 1.0 - 0.3 * dot(uv, uv);\n  col = col / (1.0 + 0.4 * col);\n  col = pow(max(col, 0.0), vec3(0.88));\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": "anthropic",
      "prompt": null,
      "params": null
    }
  }
}