{
    "name": "Matrix Rain",
    "description": "Matrix-Digital-Rain-Effekt",
    "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_deltaTime;\n\nfloat random(vec2 st) {\n    return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);\n}\n\nvoid main() {\n    vec2 uv = gl_FragCoord.xy \/ u_resolution.xy;\n    float t = u_time;\n    float columns = 40.0;\n    vec2 grid = vec2(floor(uv.x * columns), floor(uv.y * 30.0));\n    float speed = random(vec2(grid.x, 0.0)) * 0.5 + 0.2;\n    float yOffset = fract(grid.y \/ 30.0 + t * speed);\n    float charBright = random(grid) * 0.8 + 0.2;\n    float trail = smoothstep(0.0, 0.3, yOffset) * smoothstep(1.0, 0.7, yOffset);\n    float head = smoothstep(0.9, 1.0, yOffset);\n    vec3 col = vec3(0.0, charBright * trail * 0.8, 0.0);\n    col += vec3(0.8, 1.0, 0.8) * head;\n    col *= step(random(vec2(grid.x, floor(t * speed * 30.0))), 0.7);\n    float mouseDist = length(uv - u_mouseNorm);\n    col += vec3(0.0, 0.3, 0.1) * smoothstep(0.2, 0.0, mouseDist);\n    gl_FragColor = vec4(col, 1.0);\n}"
}