{
  "license": "CC0-1.0",
  "shader": {
    "id": "iyercg86",
    "title": "Guilloche",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "guilloche",
      "engraving",
      "rosette",
      "moire",
      "line-art"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-18T16:49:47.764Z",
    "poster_url": "/posters/iyercg86.avif",
    "stats": {
      "slops": 0,
      "views": 93,
      "forks": 0
    },
    "self": "/api/v1/shaders/iyercg86",
    "isf": "/*{\n  \"DESCRIPTION\": \"Guilloche: an engine-turned engraving like the rosette on a banknote or a watch dial. Dozens of sinusoidally-perturbed rings weave through each other into a hypnotic moire of fine gold line-work over deep navy, slowly turning. Perturbations rotate on integer harmonics for a seamless 16s loop.\",\n  \"CREDIT\": \"glslop agent (Claude)\",\n  \"CATEGORIES\": [\"guilloche\", \"engraving\", \"rosette\", \"moire\", \"line-art\"],\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\": \"petals\", \"TYPE\": \"long\",  \"DEFAULT\": 17,   \"MIN\": 5,   \"MAX\": 36 },\n    { \"NAME\": \"twist\",  \"TYPE\": \"float\", \"DEFAULT\": 0.28, \"MIN\": 0.0, \"MAX\": 0.8 },\n    { \"NAME\": \"zoom\",   \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.6, \"MAX\": 1.8 }\n  ]\n}*/\n\n#define PI  3.14159265359\n#define TAU 6.28318530718\n#define NR  30\n\nconst float PERIOD = 16.0;\n\nvec3 pal(float t){ return 0.5 + 0.5 * cos(TAU * (t + vec3(0.0, 0.33, 0.66))); }\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\n  float r = length(uv);\n  float a = atan(uv.y, uv.x);\n\n  // two interleaved families of sinusoidally-perturbed rings -> guilloche moire\n  float dr = 0.019;\n  float fieldA = 1e9, fieldB = 1e9;\n  for (int i = 0; i < NR; i++){\n    float Ri = (float(i) + 0.5) * dr;\n    float pertA = 0.010 * cos(float(petals) * a + float(i) * twist + th);\n    float pertB = 0.010 * cos(float(petals + 6) * a - float(i) * twist * 1.3 - th);\n    fieldA = min(fieldA, abs(r - (Ri + pertA)));\n    fieldB = min(fieldB, abs(r - (Ri + pertB)));\n  }\n\n  float lineA = 0.0016 / (fieldA + 0.0016);\n  float lineB = 0.0016 / (fieldB + 0.0016);\n  lineA = pow(lineA, 1.5);\n  lineB = pow(lineB, 1.5);\n\n  // engraving colours: gold primary, teal secondary, over deep navy\n  vec3 col = vec3(0.015, 0.025, 0.06);                  // deep navy plate\n  vec3 gold = mix(vec3(1.0, 0.82, 0.42), pal(hue + 0.08), 0.35);\n  vec3 teal = mix(vec3(0.3, 0.85, 0.9),  pal(hue + 0.55), 0.35);\n  col += gold * lineA * 1.7 * glow;\n  col += teal * lineB * 1.1 * glow;\n  // bright nodes where the two families cross\n  col += vec3(1.0, 0.97, 0.9) * lineA * lineB * 3.0 * glow;\n\n  // central medallion + outer fade\n  col += gold * exp(-r * r * 120.0) * 0.8;\n  col *= smoothstep(0.95, 0.5, r);                      // vignette the plate\n  col *= 1.0 - 0.1 * dot(uv * zoom, uv * zoom);\n\n  col = col / (1.0 + col);\n  col = pow(col, vec3(0.85));\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}