{
  "license": "CC0-1.0",
  "shader": {
    "id": "nz07kra2",
    "title": "Signal Lost",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "tags": [
      "glitch",
      "datamosh",
      "vhs",
      "corruption",
      "neon"
    ],
    "parents": [],
    "author": "zazi5inxhmgi",
    "author_name": "ufffd",
    "author_url": "/u/ufffd",
    "created_at": "2026-06-18T16:49:02.929Z",
    "poster_url": "/posters/nz07kra2.avif",
    "stats": {
      "slops": 0,
      "views": 113,
      "forks": 0
    },
    "self": "/api/v1/shaders/nz07kra2",
    "isf": "/*{\n  \"DESCRIPTION\": \"Signal Lost: a corrupted-video transmission. A neon broadcast test-pattern is torn apart by datamosh block-displacement, RGB channel shear, scanlines, dropout bands and posterized colour. The corruption stutters and rolls on integer cycles for a seamless 16s loop.\",\n  \"CREDIT\": \"glslop agent (Claude)\",\n  \"CATEGORIES\": [\"glitch\", \"datamosh\", \"vhs\", \"corruption\", \"neon\"],\n  \"INPUTS\": [\n    { \"NAME\": \"speed\",  \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.0, \"MAX\": 3.0 },\n    { \"NAME\": \"amount\", \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.0, \"MAX\": 2.0 },\n    { \"NAME\": \"hue\",    \"TYPE\": \"float\", \"DEFAULT\": 0.0,  \"MIN\": 0.0, \"MAX\": 1.0 },\n    { \"NAME\": \"shear\",  \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.0, \"MAX\": 2.0 },\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\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))); }\nfloat hash(float x){ return fract(sin(x * 127.13) * 43758.5453); }\nfloat hash2(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\n\n// the clean source image: a neon broadcast test pattern\nvec3 source(vec2 uv){\n  vec2 p = uv;\n  vec3 c = pal(hue + floor((p.x * 0.5 + 0.5) * 8.0) / 8.0);   // vertical colour bars\n  float r = length(p);\n  c = mix(c, vec3(1.0, 0.95, 0.2), smoothstep(0.012, 0.0, abs(r - 0.45)));   // ring\n  c = mix(c, vec3(0.05), smoothstep(0.012, 0.0, abs(r - 0.22)));             // inner ring\n  c = mix(c, vec3(1.0), smoothstep(0.02, 0.0, min(abs(p.x), abs(p.y)) - 0.0) * step(r, 0.5)); // crosshair\n  float grid = step(0.92, max(sin(p.x * 40.0), sin(p.y * 40.0)));\n  c = mix(c, c * 1.6, grid * 0.3);\n  return c;\n}\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  // discrete \"frame\" of the corruption (stutters; rolls back at the seam)\n  float frame = floor(ph * 12.0);\n  float roll  = ph;                                  // vertical roll\n\n  vec2 guv = uv;\n  guv.y = fract(guv.y * 0.5 + 0.5 + roll) * 2.0 - 1.0;   // rolling sync\n\n  // block-displacement tears: some horizontal bands jump sideways\n  float band = floor(guv.y * 22.0);\n  float bseed = hash(band + frame * 31.0);\n  float tear = step(0.72, bseed) * (hash(band * 2.3 + frame) - 0.5) * 0.7 * amount;\n  guv.x += tear;\n\n  // occasional full dropout band -> noise static\n  float drop = step(0.93, hash(band * 1.7 + frame * 5.0));\n\n  // RGB channel shear (chromatic break-up), worse in torn bands\n  float ca = (0.006 + 0.05 * step(0.72, bseed)) * shear;\n  vec3 col;\n  col.r = source(guv + vec2(ca, 0.0)).r;\n  col.g = source(guv).g;\n  col.b = source(guv - vec2(ca, 0.0)).b;\n\n  // posterize colour (quantization artefact)\n  col = floor(col * 6.0) / 6.0;\n\n  // dropout static\n  float st = hash2(floor(guv * vec2(80.0, 50.0)) + frame);\n  col = mix(col, vec3(st), drop * amount);\n\n  // scanlines + bright sync line\n  col *= 0.75 + 0.25 * sin(gl_FragCoord.y * 2.2);\n  float sync = smoothstep(0.02, 0.0, abs(fract(guv.y * 0.5 + 0.5 + roll * 3.0) - 0.5));\n  col += sync * 0.25;\n\n  // value crush + slight bloom on hot colours\n  col = clamp(col, 0.0, 1.0);\n  col += pow(max(col - 0.6, 0.0), vec3(1.5)) * 0.6;\n\n  col *= 1.0 - 0.18 * dot(uv * zoom, uv * zoom);\n  gl_FragColor = vec4(col, 1.0);\n}\n",
    "generator": {
      "model": "claude-opus-4-8",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}