{
    "name": "Ocean Waves",
    "description": "Realistische Ozeanwellen mit Sonnenreflexion",
    "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_zoom;\n\nfloat hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\nfloat noise(vec2 p) {\n    vec2 i = floor(p), f = fract(p);\n    f = f*f*(3.0-2.0*f);\n    return mix(mix(hash(i), hash(i+vec2(1.0,0.0)), f.x),\n               mix(hash(i+vec2(0.0,1.0)), hash(i+vec2(1.0,1.0)), f.x), f.y);\n}\n\nfloat wave(vec2 p, float t, float freq, float amp, float speed) {\n    return sin(p.x * freq + t * speed) * sin(p.y * freq * 0.5 + t * speed * 0.7) * amp;\n}\n\nvoid main() {\n    vec2 uv = gl_FragCoord.xy \/ u_resolution.xy;\n    float t = u_time * 0.5;\n    vec2 p = uv * 5.0 * u_zoom;\n    float h = wave(p, t, 2.0, 0.3, 1.0);\n    h += wave(p, t, 4.0, 0.15, 1.3);\n    h += wave(p, t, 8.0, 0.08, 1.7);\n    h += noise(p * 2.0 + t) * 0.1;\n    vec3 deep = vec3(0.0, 0.1, 0.3);\n    vec3 shallow = vec3(0.0, 0.4, 0.6);\n    vec3 foam = vec3(0.9, 0.95, 1.0);\n    vec3 col = mix(deep, shallow, smoothstep(-0.5, 0.5, h));\n    col = mix(col, foam, smoothstep(0.6, 0.8, h));\n    vec2 sunPos = vec2(0.7, 0.8) + (u_mouseNorm - 0.5) * 0.3;\n    float sunSpec = pow(max(1.0 - length(uv - sunPos) * 3.0 - h * 0.5, 0.0), 16.0);\n    col += vec3(1.0, 0.95, 0.8) * sunSpec;\n    gl_FragColor = vec4(col, 1.0);\n}"
}