// Starfield Generator // HMS MediaEngine – Generator (GLES, Raspberry Pi). ES 2.0: texture2D, gl_FragColor, Schleifen mit konstanter Höchstgrenze. #version 100 precision mediump float; uniform vec2 u_resolution; uniform float u_time_seconds; uniform float u_delta_seconds; uniform float u_frame_index; uniform float u_layer_opacity; uniform float u_audio_rms; uniform float u_audio_peak; uniform float u_audio_bass; uniform float u_audio_mid; uniform float u_audio_treble; uniform float u_audio_beat; uniform float4 param_color_a; uniform float4 param_color_b; uniform float param_count; uniform float param_size; uniform float param_speed; uniform float param_direction_x; uniform float param_direction_y; uniform float param_depth; uniform float param_twinkle; uniform float param_seed; uniform float u_quality_samples; varying vec2 v_uv; float hash21(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } void main() { vec2 p = v_uv; float t = u_time_seconds * param_speed; float maxN = clamp(u_quality_samples, 1.0, 512.0); float dl = length(vec2(param_direction_x, param_direction_y)); vec2 dir = dl > 1e-4 ? vec2(param_direction_x, param_direction_y) / dl : vec2(0.0, -1.0); float acc = 0.0; float colAcc = 0.0; for (int i = 0; i < 512; i++) { if (float(i) >= maxN) { break; } vec2 base = vec2(hash21(vec2(float(i) + param_seed, 1.0)), hash21(vec2(float(i) + param_seed, 2.0))); float depth = hash21(vec2(float(i) + param_seed, 3.0)) * param_depth; vec2 pos = base + dir * t * (0.1 + depth * 0.9); pos = fract(pos); vec2 d = pos - p; d = abs(d); d = min(d, 1.0 - d); float dist = length(d); float s = param_size * (0.3 + depth); float star = exp(-dist * dist / max(s * s, 1e-5)); float tw = 0.5 + 0.5 * sin(t * 3.0 + param_seed * 10.0 + float(i) * 1.7); star *= mix(1.0, tw, param_twinkle); acc += star; colAcc += star * depth; } acc = clamp(acc, 0.0, 1.0); float mixT = maxN > 1.0 ? colAcc / max(acc, 1e-5) : 0.0; vec3 col = mix(param_color_a.rgb, param_color_b.rgb, mixT); gl_FragColor = vec4(col * acc * u_layer_opacity, acc * u_layer_opacity); }