{
    "name": "Neon Grid",
    "description": "Retro-Neon-Grid mit Perspektive und Glow",
    "vertex_shader": "attribute vec2 a_position;\nvoid main() {\n    gl_Position = vec4(a_position, 0.0, 1.0);\n}",
    "fragment_shader": "precision mediump float;\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform vec2 u_mouseNorm;\nuniform float u_audioLow;\nuniform float u_audioMid;\n\nvoid main() {\n    vec2 uv = gl_FragCoord.xy \/ u_resolution.xy;\n    vec2 p = (uv - 0.5) * vec2(u_resolution.x\/u_resolution.y, 1.0);\n    float t = u_time * 0.5;\n    vec3 col = vec3(0.02, 0.0, 0.05);\n    float horizon = 0.3 + sin(t * 0.3) * 0.1;\n    float perspective = 1.0 \/ (p.y + horizon);\n    float gridX = p.x * perspective * 8.0 + t * 2.0;\n    float gridY = perspective * 8.0 + t * 3.0;\n    float grid = step(0.95, fract(gridX)) + step(0.95, fract(gridY));\n    float fade = smoothstep(0.0, horizon, p.y + horizon);\n    vec3 gridCol = vec3(0.0, 0.8, 1.0) * grid * fade;\n    gridCol += vec3(1.0, 0.0, 0.5) * grid * fade * u_audioLow;\n    gridCol += vec3(0.5, 1.0, 0.0) * grid * fade * u_audioMid * 0.5;\n    float sun = smoothstep(0.15, 0.0, abs(p.y + horizon - 0.05));\n    col += vec3(1.0, 0.3, 0.6) * sun;\n    col += gridCol;\n    float mouseDist = length(uv - u_mouseNorm);\n    col += vec3(0.5, 0.0, 1.0) * smoothstep(0.3, 0.0, mouseDist) * 0.3;\n    gl_FragColor = vec4(col, 1.0);\n}"
}