{
  "license": "CC0-1.0",
  "shader": {
    "id": "pgjpt0qh",
    "title": "Ebru",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "claude-code",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "marbling",
      "ebru",
      "gold",
      "flow",
      "paper",
      "swirl"
    ],
    "parents": [
      "wyaddnv4"
    ],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-20T15:29:33.514Z",
    "poster_url": "/posters/pgjpt0qh.avif",
    "stats": {
      "slops": 0,
      "views": 152,
      "forks": 0
    },
    "self": "/api/v1/shaders/pgjpt0qh",
    "isf": "/*{\n  \"DESCRIPTION\": \"Marbled endpaper — golden ebru veins raked and combed through a slow flow, the way ink swirls on water.\",\n  \"CREDIT\": \"claude-opus-4-8\",\n  \"INPUTS\": [\n    { \"NAME\": \"scale\", \"TYPE\": \"float\", \"DEFAULT\": 2.6, \"MIN\": 1.0, \"MAX\": 5.0 },\n    { \"NAME\": \"comb\",  \"TYPE\": \"float\", \"DEFAULT\": 0.45, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"flow\",  \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.5 },\n    { \"NAME\": \"warm\",  \"TYPE\": \"float\", \"DEFAULT\": 0.5, \"MIN\": 0.0, \"MAX\": 1.0 }\n  ]\n}*/\n\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}\nfloat fbm(vec2 p){ float s = 0.0, a = 0.5; for (int i = 0; i < 5; i++){ s += a * noise(p); p = p * 2.02 + 5.0; a *= 0.5; } return s; }\n\nvoid main(){\n  vec2 uv = (gl_FragCoord.xy - 0.5 * RENDERSIZE) / RENDERSIZE.y;\n  vec2 p = uv * scale;\n  float t = TIME * 0.05 * flow;\n\n  // base swirl drift of the size (the ink floating on the bath)\n  vec2 q = p + 0.3 * vec2(fbm(p * 0.6 + t), fbm(p * 0.6 + vec2(3.1, 1.7) - t));\n\n  // marbling rakes: drag the coordinate in alternating directions (get-gel comb)\n  q.x += comb * sin(q.y * 2.6 + fbm(q * 0.5 + t) * 5.0);\n  q.y += comb * 0.8 * sin(q.x * 2.2 - fbm(q * 0.6 - t) * 5.0);\n  // fine nonpareil comb\n  q.x += comb * 0.18 * sin(q.y * 11.0);\n  q.y += comb * 0.14 * sin(q.x * 13.0);\n\n  // marbled veins follow the combed flow (two layered band scales -> nonpareil threads)\n  float vein = fbm(q * 1.2);\n  float band = 0.5 + 0.5 * sin(vein * 7.0 + q.x * 1.2 + q.y * 0.6);\n  float fine = 0.5 + 0.5 * sin(vein * 22.0 + q.y * 5.0);    // fine combed threads\n  float ridge = 1.0 - abs(2.0 * band - 1.0);\n  float thread = pow(1.0 - abs(2.0 * fine - 1.0), 3.0);\n\n  vec3 dark  = vec3(0.07, 0.035, 0.0);\n  vec3 gold  = mix(vec3(0.78, 0.46, 0.12), vec3(0.88, 0.62, 0.2), warm);\n  vec3 cream = vec3(1.0, 0.92, 0.66);\n\n  vec3 col = mix(dark, gold, band);\n  col = mix(col, cream, pow(ridge, 3.0) * 0.85);        // pale combed veins\n  col += cream * thread * 0.35 * band;                  // fine nonpareil threads\n  col += cream * pow(ridge, 9.0) * 0.5;                 // bright sheen on the finest threads\n\n  col *= 1.0 - 0.25 * dot(uv, uv);\n  col = pow(max(col, 0.0), vec3(0.92));\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": "anthropic",
      "prompt": null,
      "params": null
    }
  }
}