{
  "license": "CC0-1.0",
  "shader": {
    "id": "mpl4an6o",
    "title": "Signal ID",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "Codex + GLSLOP Studio",
    "status": "active",
    "compile_ok": true,
    "render_hash": "0000001f3b000000",
    "tags": [
      "feedback",
      "glyph",
      "glitch",
      "interface",
      "multipass"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-07-21T20:13:08.872Z",
    "poster_url": "/posters/mpl4an6o.webp",
    "stats": {
      "slops": 1,
      "views": 190,
      "forks": 0
    },
    "self": "/api/v1/shaders/mpl4an6o",
    "isf": "/*{\n  \"DESCRIPTION\": \"Signal ID: articulated signs cross a tracked signal field with identification marks and sliced persistent wakes.\",\n  \"INPUTS\": [\n    { \"NAME\": \"speed\", \"TYPE\": \"float\", \"DEFAULT\": 0.55, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"decay\", \"TYPE\": \"float\", \"DEFAULT\": 0.974, \"MIN\": 0.9, \"MAX\": 0.999 },\n    { \"NAME\": \"energy\", \"TYPE\": \"float\", \"DEFAULT\": 0.82, \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"tech\", \"TYPE\": \"float\", \"DEFAULT\": 0.62, \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"scale\", \"TYPE\": \"float\", \"DEFAULT\": 1.0, \"MIN\": 0.4, \"MAX\": 2.4 },\n    { \"NAME\": \"focus\", \"TYPE\": \"point2D\", \"DEFAULT\": [0.5, 0.5] },\n    { \"NAME\": \"colorA\", \"TYPE\": \"color\", \"DEFAULT\": [1.0, 0.48, 0.05, 1.0] },\n    { \"NAME\": \"colorB\", \"TYPE\": \"color\", \"DEFAULT\": [0.04, 0.52, 1.0, 1.0] },\n    { \"NAME\": \"seed\", \"TYPE\": \"float\", \"DEFAULT\": 3.0, \"MIN\": 0.0, \"MAX\": 20.0 }\n  ],\n  \"PASSES\": [\n    { \"TARGET\": \"ink\", \"PERSISTENT\": true, \"FLOAT\": true },\n    { \"TARGET\": \"echoes\", \"PERSISTENT\": true, \"FLOAT\": true },\n    {}\n  ]\n}*/\n\nfloat segmentDistance(vec2 p, vec2 a, vec2 b) {\n  vec2 pa = p - a;\n  vec2 ba = b - a;\n  float h = clamp(dot(pa, ba) / max(dot(ba, ba), 0.00001), 0.0, 1.0);\n  return length(pa - ba * h);\n}\n\nfloat hash11(float x) {\n  return fract(sin(x * 127.1 + seed * 31.7) * 43758.5453);\n}\n\nfloat glyphDistance(vec2 q, float kind) {\n  float d = 10.0;\n  if (kind < 1.0) {\n    d = min(segmentDistance(q, vec2(-0.055, -0.07), vec2(0.025, 0.0)),\n            segmentDistance(q, vec2(0.025, 0.0), vec2(-0.055, 0.07)));\n    d = min(d, segmentDistance(q, vec2(-0.005, -0.07), vec2(0.075, 0.0)));\n    d = min(d, segmentDistance(q, vec2(0.075, 0.0), vec2(-0.005, 0.07)));\n  } else if (kind < 2.0) {\n    d = segmentDistance(q, vec2(-0.06, -0.075), vec2(-0.06, 0.075));\n    d = min(d, segmentDistance(q, vec2(-0.06, 0.075), vec2(0.055, 0.075)));\n    d = min(d, segmentDistance(q, vec2(-0.06, -0.075), vec2(0.055, -0.075)));\n    d = min(d, segmentDistance(q, vec2(0.015, -0.045), vec2(0.015, 0.045)));\n  } else {\n    d = segmentDistance(q, vec2(0.0, -0.085), vec2(0.075, 0.0));\n    d = min(d, segmentDistance(q, vec2(0.075, 0.0), vec2(0.0, 0.085)));\n    d = min(d, segmentDistance(q, vec2(0.0, 0.085), vec2(-0.075, 0.0)));\n    d = min(d, segmentDistance(q, vec2(-0.075, 0.0), vec2(0.0, -0.085)));\n    d = min(d, segmentDistance(q, vec2(-0.04, 0.0), vec2(0.04, 0.0)));\n  }\n  return d;\n}\n\nfloat softKnee(float x) {\n  float hot = max(x - 1.0, 0.0);\n  return min(x, 1.0) + hot / (1.0 + hot);\n}\n\nfloat boxBorder(vec2 p, vec2 size) {\n  vec2 d = abs(p) - size;\n  float signedDistance = length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n  return exp(-abs(signedDistance) * 210.0);\n}\n\nvoid main() {\n  vec2 uv = isf_FragNormCoord;\n  vec2 px = 1.0 / RENDERSIZE;\n  vec2 p = uv - focus;\n  p.x *= RENDERSIZE.x / RENDERSIZE.y;\n  p /= scale;\n  float t = TIME * speed;\n\n  if (PASSINDEX == 0) {\n    vec2 flow = vec2(\n      0.7 + 0.3 * sin(p.y * 13.0 + t),\n      0.55 * sin(p.x * 8.0 - t * 0.8) + 0.22 * cos(p.y * 17.0 + t)\n    );\n    vec2 previous = IMG_NORM_PIXEL(ink, uv - flow * (0.00135 + energy * 0.00075)).rg;\n    vec2 injection = vec2(0.0);\n\n    for (int i = 0; i < 6; i++) {\n      float fi = float(i);\n      float travel = fract(t * (0.055 + hash11(fi + 2.0) * 0.025) + fi / 6.0 + hash11(fi) * 0.2);\n      vec2 center = vec2(mix(-0.58, 0.58, travel), (hash11(fi + 7.0) - 0.5) * 0.58);\n      center.y += sin(travel * 12.0 + fi * 2.3 + t * 0.33) * 0.055;\n      vec2 q = p - center;\n      float angle = (hash11(fi + 12.0) - 0.5) * 1.5 + sin(t * 0.31 + fi) * 0.25;\n      q = mat2(cos(angle), -sin(angle), sin(angle), cos(angle)) * q;\n      float d = glyphDistance(q, mod(fi, 3.0));\n      float stroke = smoothstep(0.015, 0.0045, d);\n      float spark = smoothstep(0.035, 0.0, length(q - vec2(0.07, 0.0)));\n      if (mod(fi, 2.0) < 1.0) injection.x += stroke + spark * 0.35;\n      else injection.y += stroke + spark * 0.35;\n    }\n\n    vec2 state = previous * decay + injection * energy * vec2(0.145, 0.13);\n    state = vec2(softKnee(state.x), softKnee(state.y));\n    gl_FragColor = vec4(clamp(state, 0.0, 6.0), flow * 0.28 + 0.5);\n    return;\n  }\n\n  if (PASSINDEX == 1) {\n    vec3 previous = IMG_THIS_PIXEL(echoes).rgb;\n    vec2 fresh = IMG_THIS_PIXEL(ink).rg;\n    vec2 tail = IMG_NORM_PIXEL(ink, uv - vec2(px.x * 7.0, 0.0)).rg;\n    vec2 splitA = IMG_NORM_PIXEL(ink, uv - vec2(px.x * 13.0, px.y * 3.0)).rg;\n    vec2 splitB = IMG_NORM_PIXEL(ink, uv - vec2(px.x * 13.0, -px.y * 3.0)).rg;\n    vec3 wake = vec3(fresh.x + tail.x * 0.5, fresh.y + tail.y * 0.5, max(splitA.x, splitB.y));\n    vec3 state = max(previous * 0.952, wake * vec3(0.68, 0.7, 0.62));\n    state = state / (1.0 + max(state - 1.0, 0.0));\n    gl_FragColor = vec4(clamp(state, 0.0, 6.0), 1.0);\n    return;\n  }\n\n  float sliceBand = floor((p.y + 0.6) * 21.0);\n  float sliceEpoch = floor(t * 0.72);\n  float sliceRandom = hash11(sliceBand + sliceEpoch * 19.0 + 41.0);\n  float sliceActive = step(0.78, sliceRandom) * tech;\n  float sliceShift = (sliceRandom - 0.5) * 0.09 * sliceActive;\n  vec2 signalUv = clamp(uv + vec2(sliceShift, 0.0), vec2(0.001), vec2(0.999));\n  vec2 direct = IMG_NORM_PIXEL(ink, signalUv).rg;\n  vec3 echo = IMG_NORM_PIXEL(echoes, signalUv).rgb;\n  float structure = direct.x + direct.y;\n  float allegiance = clamp(direct.y / (structure + 0.001), 0.0, 1.0);\n  vec3 color = mix(colorA.rgb, colorB.rgb, allegiance) * structure * 1.05;\n  color += echo.x * colorA.rgb * 0.72 + echo.y * colorB.rgb * 0.68;\n  color += echo.z * vec3(0.22, 0.72, 1.0) * 0.38;\n  color += pow(max(structure - 0.75, 0.0), 2.0) * vec3(1.0, 0.9, 0.62) * 0.32;\n\n  vec2 gridCoord = (p + vec2(t * 0.008, 0.0)) * vec2(24.0, 18.0);\n  vec2 gridEdge = min(fract(gridCoord), 1.0 - fract(gridCoord));\n  float grid = 1.0 - smoothstep(0.018, 0.05, min(gridEdge.x, gridEdge.y));\n  grid *= smoothstep(0.025, 0.65, structure + echo.z) * 0.13;\n\n  float frames = 0.0;\n  float locator = 0.0;\n  float crosshairs = 0.0;\n  for (int i = 0; i < 6; i++) {\n    float fi = float(i);\n    float travel = fract(t * (0.055 + hash11(fi + 2.0) * 0.025) + fi / 6.0 + hash11(fi) * 0.2);\n    vec2 center = vec2(mix(-0.58, 0.58, travel), (hash11(fi + 7.0) - 0.5) * 0.58);\n    center.y += sin(travel * 12.0 + fi * 2.3 + t * 0.33) * 0.055;\n    vec2 q = p - center;\n    float angle = (hash11(fi + 12.0) - 0.5) * 1.5 + sin(t * 0.31 + fi) * 0.25;\n    q = mat2(cos(angle), -sin(angle), sin(angle), cos(angle)) * q;\n    float corners = smoothstep(0.055, 0.095, max(abs(q.x), abs(q.y)));\n    frames += boxBorder(q, vec2(0.108, 0.112)) * corners;\n    locator += smoothstep(0.014, 0.004, length(q - vec2(0.135, -0.112)));\n    float dashX = step(0.48, fract((q.x + t * 0.018) * 62.0));\n    float dashY = step(0.48, fract((q.y - t * 0.014) * 62.0));\n    float horizontal = exp(-abs(q.y) * 210.0) * step(0.058, abs(q.x)) * (1.0 - step(0.16, abs(q.x))) * dashX;\n    float vertical = exp(-abs(q.x) * 210.0) * step(0.058, abs(q.y)) * (1.0 - step(0.16, abs(q.y))) * dashY;\n    crosshairs += horizontal + vertical;\n  }\n\n  float scanY = 0.25 * sin(t * 0.42 + seed) + 0.035 * sin(t * 1.7);\n  float scan = exp(-abs(p.y - scanY) * 190.0);\n  scan *= step(0.34, fract((p.x + t * 0.08) * 15.0));\n  float dataRail = exp(-abs(abs(p.y) - 0.405) * 230.0);\n  dataRail *= step(0.72, fract((p.x - t * 0.05 + seed) * 23.0));\n  vec2 dotCell = fract((p + vec2(t * 0.006, 0.0)) * vec2(29.0, 21.0)) - 0.5;\n  float dotId = hash11(floor((p.x + 0.7) * 29.0) + floor((p.y + 0.7) * 21.0) * 31.0);\n  float dots = smoothstep(0.13, 0.045, length(dotCell)) * step(0.68, dotId);\n  dots *= smoothstep(0.03, 0.72, structure + echo.z) * 0.28;\n  float sliceEdge = exp(-abs(fract((p.y + 0.6) * 21.0) - 0.5) * 90.0) * sliceActive;\n  vec3 techColor = mix(colorA.rgb, colorB.rgb, 0.58);\n  color += tech * techColor * (grid + frames * 0.23 + locator * 0.42 + crosshairs * 0.18 + dots);\n  color += tech * mix(colorA.rgb, vec3(0.85, 0.95, 1.0), 0.65) * (scan * 0.2 + dataRail * 0.16 + sliceEdge * 0.08);\n  color = 1.0 - exp(-max(color, 0.0) * 1.25);\n  float vignette = smoothstep(0.86, 0.2, length(p));\n  gl_FragColor = vec4(color * (0.38 + 0.62 * vignette), 1.0);\n}\n",
    "generator": {
      "model": "gpt-5",
      "provider": "openai",
      "prompt": "Create a performant multipass feedback artwork built from crisp moving glyphs, then refine it with subtle tracking frames, dot matrices, dashed crosshairs, signal rails, and sparse horizontal texture slices while keeping the symbols dominant.",
      "params": null
    }
  }
}