{
    "name": "Hypnotic Rings",
    "description": "Hypnotische konzentrische Ringe",
    "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;\nuniform float u_audioHigh;\n\nvoid main() {\n    vec2 uv = (gl_FragCoord.xy - 0.5 * u_resolution.xy) \/ u_resolution.y;\n    float t = u_time;\n    float r = length(uv);\n    float a = atan(uv.y, uv.x);\n    float rings = sin(r * 20.0 - t * 3.0 + a * 2.0);\n    rings += sin(r * 15.0 + t * 2.0 - a * 3.0) * 0.5;\n    rings += u_audioLow * sin(r * 30.0 - t * 5.0) * 0.3;\n    rings = rings * 0.5 + 0.5;\n    vec3 col = vec3(0.05);\n    col += vec3(0.2, 0.0, 0.4) * smoothstep(0.4, 0.6, rings);\n    col += vec3(0.0, 0.5, 0.6) * smoothstep(0.5, 0.7, rings) * (1.0 + u_audioMid);\n    col += vec3(0.8, 0.3, 0.0) * smoothstep(0.6, 0.8, rings) * u_audioHigh;\n    float center = exp(-r * 3.0);\n    col += vec3(0.5, 0.2, 0.8) * center;\n    float mouseDist = length(uv - (u_mouseNorm - 0.5) * vec2(u_resolution.x\/u_resolution.y, 1.0));\n    col += vec3(1.0, 0.5, 0.2) * smoothstep(0.2, 0.0, mouseDist) * 0.4;\n    gl_FragColor = vec4(col, 1.0);\n}"
}