{
  "format": "field",
  "version": 1,
  "meta": {
    "name": "1-Bit Ditherpunk Bayer Matrix Threshold",
    "author": "Infinite",
    "description": "High-contrast 1-bit Bayer ordered dither shader with audio-reactive threshold modulation, concentric cyber-glyphs, and duo-tone palette.",
    "domain": "pixel"
  },
  "device": {
    "code": "param float matrixScale = 3.0 [1.0, 8.0]\nparam float glyphRings = 6.0 [2.0, 14.0]\nparam float warpSpeed = 0.75 [0.1, 2.5]\nparam float thresholdOffset = 0.04 [-0.4, 0.4]\nparam float edgeContrast = 1.25 [0.5, 2.5]\n\np = vec2((uv.x - 0.5) * aspect, uv.y - 0.5) * 2.2\ntime = t * warpSpeed\n\nr = length(p)\nang = atan2(p.y, p.x)\n\nwarp = sin(r * 10.0 - time * 2.0) * 0.08\nrWarp = r + warp\n\nrings = sin(rWarp * glyphRings * 3.14159) * 0.5 + 0.5\nspokes = abs(cos(ang * 8.0 + time * 0.8))\n\nrawLum = (rings * 0.65 + spokes * 0.35) * smoothstep(1.3, 0.1, r)\n\npx = floor(uv * res / matrixScale)\ngx = fmod(px.x, 4.0)\ngy = fmod(px.y, 4.0)\nbayer = (gx * 3.0 + gy * 7.0) / 16.0\n\ndithered = step(bayer + thresholdOffset, rawLum * edgeContrast)\n\ncBlue = vec3(0.012, 0.045, 0.450)\ncIvory = vec3(0.965, 0.950, 0.915)\n\ncol = mix(cBlue, cIvory, dithered)\nout = clamp(col, 0.0, 1.0)\n",
    "params": {
      "matrixScale": 3.0,
      "glyphRings": 6.0,
      "warpSpeed": 0.75,
      "thresholdOffset": 0.04,
      "edgeContrast": 1.25
    },
    "nodeSettings": {
      "width": 1080.0,
      "height": 1080.0,
      "animate": 1.0
    }
  }
}