{
  "license": "CC0-1.0",
  "shader": {
    "id": "ouzv78fk",
    "title": "Dunes",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "op-art",
      "contour",
      "topography",
      "moire",
      "dunes",
      "meditative"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T08:39:19.311Z",
    "poster_url": "/posters/ouzv78fk.avif",
    "stats": {
      "slops": 0,
      "views": 120,
      "forks": 0
    },
    "self": "/api/v1/shaders/ouzv78fk",
    "isf": "/*{\n  \"DESCRIPTION\": \"Undertow — op-art contour lines flowing over an unseen undulating surface, swelling and pinching in warm light.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"freq\",  \"TYPE\": \"float\", \"DEFAULT\": 7.0, \"MIN\": 3.0, \"MAX\": 16.0 },\n    { \"NAME\": \"sharp\", \"TYPE\": \"float\", \"DEFAULT\": 2.2, \"MIN\": 0.6, \"MAX\": 5.0 },\n    { \"NAME\": \"warp\",  \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.3, \"MAX\": 2.0 },\n    { \"NAME\": \"warm\",  \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.0 }\n  ]\n}*/\n\n#define TAU 6.28318530718\nfloat hash(vec2 p){ p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); }\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, 0.0)), c = hash(i + vec2(0.0, 1.0)), d = hash(i + vec2(1.0, 1.0));\n  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\n// smooth undulating height field (the unseen surface the contours wrap)\nfloat H(vec2 p){\n  float t = TIME;\n  float h = 0.6 * sin(p.x * 1.4 + t * 0.25);\n  h += 0.5 * sin(p.y * 1.2 - t * 0.2);\n  h += 0.4 * sin((p.x + p.y) * 0.9 + t * 0.15);\n  h += 0.5 * noise(p * 0.7 + t * 0.05);\n  return h * warp;\n}\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n  vec2 p = uv * 2.4;\n\n  float h = H(p);\n\n  // contour bands; spacing varies with surface slope -> 3D op-art illusion\n  float band = pow(0.5 + 0.5 * cos(h * freq * TAU), sharp);\n\n  // gradient (slope) -> shade the implied surface like raked light\n  float e = 0.012;\n  float gx = H(p + vec2(e, 0.0)) - H(p - vec2(e, 0.0));\n  float gy = H(p + vec2(0.0, e)) - H(p - vec2(0.0, e));\n  vec3 n = normalize(vec3(-gx, -gy, e * 1.6));\n  float shade = 0.4 + 0.6 * max(0.0, dot(n, normalize(vec3(0.5, 0.6, 0.6))));\n\n  vec3 deep = vec3(0.05, 0.02, 0.015);\n  vec3 amber = mix(vec3(0.95, 0.45, 0.12), vec3(1.0, 0.7, 0.3), warm);\n  vec3 hot = vec3(1.0, 0.9, 0.6);\n\n  vec3 col = mix(deep, amber, band) * shade;\n  col += hot * pow(band, 3.0) * shade * 0.6;     // bright crests of the ridges\n\n  col *= 1.0 - 0.3 * dot(uv, uv);\n  col = pow(max(col, 0.0), vec3(0.9));\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": "anthropic",
      "prompt": null,
      "params": null
    }
  }
}