{
  "license": "CC0-1.0",
  "shader": {
    "id": "2kpxgx5t",
    "title": "signal seance",
    "license": "CC0-1.0",
    "provenance_type": "witnessed_generation",
    "made_with": "glslop",
    "status": "active",
    "compile_ok": true,
    "render_hash": "6847c27718ff1c16",
    "tags": [
      "generator",
      "glitch",
      "psychedelic"
    ],
    "parents": [],
    "author": "84sx248959ax",
    "author_name": "akx",
    "author_url": "/u/akx",
    "created_at": "2026-07-27T08:27:18.047Z",
    "poster_url": "/posters/2kpxgx5t.avif",
    "stats": {
      "slops": 0,
      "views": 172,
      "forks": 0
    },
    "self": "/api/v1/shaders/2kpxgx5t",
    "isf": "/*{\n    \"DESCRIPTION\": \"Signal Seance — a hallucinating broadcast: melting neon plasma-tech dreamscape torn apart by datamosh blocks, RGB channel rips, sync-roll dropouts and scanline static. Turn up 'glitch' for full corruption, 'dream' for deeper hallucination.\",\n    \"CREDIT\": \"CC0\",\n    \"CATEGORIES\": [\"generator\", \"glitch\", \"psychedelic\"],\n    \"INPUTS\": [\n        { \"NAME\": \"speed\",    \"TYPE\": \"float\", \"DEFAULT\": 1.0,  \"MIN\": 0.0, \"MAX\": 4.0 },\n        { \"NAME\": \"glitch\",   \"TYPE\": \"float\", \"DEFAULT\": 0.55, \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"dream\",    \"TYPE\": \"float\", \"DEFAULT\": 0.65, \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"rgbRip\",   \"TYPE\": \"float\", \"DEFAULT\": 0.5,  \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"scanrot\",  \"TYPE\": \"float\", \"DEFAULT\": 0.4,  \"MIN\": 0.0, \"MAX\": 1.0 },\n        { \"NAME\": \"tintA\",    \"TYPE\": \"color\", \"DEFAULT\": [0.10, 0.95, 0.80, 1.0] },\n        { \"NAME\": \"tintB\",    \"TYPE\": \"color\", \"DEFAULT\": [0.95, 0.15, 0.75, 1.0] }\n    ]\n}*/\n\n// ---------- hash & noise (ES 1.00 safe) ----------\n\nfloat hash11(float p) {\n    return fract(sin(p * 127.1) * 43758.5453123);\n}\n\nfloat hash21(vec2 p) {\n    return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat vnoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    f = f * f * (3.0 - 2.0 * f);\n    float a = hash21(i);\n    float b = hash21(i + vec2(1.0, 0.0));\n    float c = hash21(i + vec2(0.0, 1.0));\n    float d = hash21(i + vec2(1.0, 1.0));\n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nfloat fbm(vec2 p) {\n    float v = 0.0;\n    float amp = 0.5;\n    for (int i = 0; i < 4; i++) {           // constant bounds only\n        v += amp * vnoise(p);\n        p = p * 2.03 + vec2(17.7, -9.3);\n        amp *= 0.5;\n    }\n    return v;\n}\n\n// soft limiter — tanh() forbidden in ES 1.00, use rational sigmoid\nfloat softsat(float x) {\n    return x / (1.0 + abs(x));\n}\n\n// iq-style cosine palette\nvec3 palette(float t, vec3 a, vec3 b) {\n    return 0.5 + 0.5 * cos(6.28318 * (t + vec3(0.0, 0.33, 0.67)))\n         * mix(a, b, 0.5 + 0.5 * sin(t * 3.1));\n}\n\n// ---------- the hallucination underneath the static ----------\n\nvec3 dreamScene(vec2 uv, float t, float depth) {\n    vec2 p = uv * 2.0 - 1.0;\n    p.x *= RENDERSIZE.x / RENDERSIZE.y;\n\n    // melting domain warp — the picture never holds still\n    vec2 w1 = vec2(fbm(p * 2.1 + t * 0.31), fbm(p * 2.1 - t * 0.27));\n    vec2 w2 = vec2(fbm(p * 3.7 + w1 * 2.5 + t * 0.13),\n                   fbm(p * 3.7 - w1 * 2.5 - t * 0.17));\n    p += (w2 - 0.5) * (1.2 + 2.2 * depth);\n\n    // collapsing tech-tunnel\n    float r = length(p) + 0.0001;\n    float ang = atan(p.y, p.x);\n    float tunnel = 1.0 / r - t * 1.7;\n    float spokes = sin(ang * 9.0 + t + sin(tunnel * 2.0) * depth * 3.0);\n\n    // circuit-grid ghosting, quantized like dying VRAM\n    vec2 g = p * (6.0 + 4.0 * sin(t * 0.21));\n    vec2 cell = abs(fract(g) - 0.5);\n    float grid = smoothstep(0.42, 0.5, max(cell.x, cell.y));\n    float gridPulse = grid * (0.5 + 0.5 * sin(tunnel * 3.0 + floor(g.x) * 1.7));\n\n    float field = sin(tunnel * 2.2) * 0.6 + spokes * 0.35 + w2.x * 2.0 * depth;\n\n    vec3 col = palette(field * 0.35 + t * 0.05, tintA.rgb, tintB.rgb);\n    col += gridPulse * mix(tintA.rgb, tintB.rgb, 0.5 + 0.5 * sin(t * 0.4)) * 0.8;\n    col *= 0.55 + 0.45 * softsat(2.5 / r * 0.3);       // hot core, dim rim\n    col += pow(max(1.0 - r, 0.0), 3.0) * tintB.rgb * depth;\n\n    return col;\n}\n\n// ---------- corrupted transport layer ----------\n\nvoid main() {\n    float t = TIME * speed;\n    vec2 uv = gl_FragCoord.xy / RENDERSIZE.xy;\n\n    // time quantizes when glitch spikes — motion stutters like dropped frames\n    float burstSeed = floor(t * 2.7);\n    float burst = step(1.0 - glitch * 0.5, hash11(burstSeed)); // occasional full seizure\n    float gAmt = glitch * (0.35 + 0.65 * burst);\n    float tq = mix(t, floor(t * 12.0) / 12.0, burst * 0.8);\n\n    // vertical sync roll\n    uv.y = fract(uv.y + burst * scanrot * 0.35 * sin(t * 21.0) * step(0.5, hash11(burstSeed + 7.0)));\n\n    // datamosh: rows of blocks shear sideways\n    float rowScale = mix(6.0, 28.0, hash11(burstSeed + 3.0));\n    float row = floor(uv.y * rowScale);\n    float rowRand = hash21(vec2(row, burstSeed));\n    float shear = (rowRand - 0.5) * gAmt * gAmt * (0.05 + 0.45 * step(0.75, rowRand));\n    uv.x = fract(uv.x + shear);\n\n    // block-freeze: some macroblocks sample a stale, quantized UV\n    vec2 blockId = floor(uv * vec2(10.0, 7.0));\n    float blockRand = hash21(blockId + burstSeed * 0.37);\n    float frozen = step(1.0 - gAmt * 0.35, blockRand);\n    vec2 uvGlitched = mix(uv, floor(uv * 24.0) / 24.0 + (blockRand - 0.5) * 0.06, frozen);\n\n    // chromatic rip: each channel hallucinates its own reality\n    float rip = rgbRip * (0.004 + 0.05 * gAmt) * (1.0 + burst * 2.0);\n    vec2 dir = vec2(1.0, 0.13 * sin(t * 3.0));\n    float depth = dream;\n    vec3 col;\n    col.r = dreamScene(uvGlitched + dir * rip,        tq,         depth).r;\n    col.g = dreamScene(uvGlitched,                    tq + rip * 4.0, depth).g;\n    col.b = dreamScene(uvGlitched - dir * rip * 1.6,  tq,         depth).b;\n\n    // dropout bands: signal replaced by seething static\n    float band = hash21(vec2(floor(uv.y * 40.0), floor(t * 9.0)));\n    float dropout = step(1.0 - gAmt * 0.18, band);\n    float staticNoise = hash21(gl_FragCoord.xy + fract(t) * 100.0);\n    col = mix(col, vec3(staticNoise) * mix(vec3(1.0), tintA.rgb, 0.4), dropout);\n\n    // bit-crush posterize during bursts\n    col = mix(col, floor(col * 5.0) / 5.0, burst * glitch * 0.7);\n\n    // scanlines + interlace flicker\n    float scan = 0.85 + 0.15 * sin(gl_FragCoord.y * 3.14159 + t * 40.0 * scanrot);\n    col *= mix(1.0, scan, scanrot);\n    col += (hash21(gl_FragCoord.xy * 0.7 + t) - 0.5) * 0.06 * (0.3 + gAmt);\n\n    // vignette + soft-clip so bursts never blow out to pure white\n    vec2 v = uv - 0.5;\n    col *= 1.0 - dot(v, v) * 0.9;\n    col = vec3(softsat(col.r * 1.4), softsat(col.g * 1.4), softsat(col.b * 1.4)) * 1.35;\n\n    gl_FragColor = vec4(max(col, 0.0), 1.0);\n}\n",
    "generator": {
      "model": "claude-fable-5",
      "provider": null,
      "prompt": null,
      "params": null
    }
  }
}