// Plasma Generator // HMS MediaEngine – Generator (kein Eingangstextur-Bezug, cbuffer identisch §14.4) // D3D11-Pixelshader (PS_5_0). Semantik identisch zu GL/GLES (§12.6, §15.1). Texture2D u_input_texture : register(t0); SamplerState u_sampler : register(s0); cbuffer hms_params : register(b0) { float4 u_resolution; // xy = Auflösung in Pixeln float u_time_seconds; float u_delta_seconds; float u_frame_index; float u_layer_opacity; float u_audio_rms; float u_audio_peak; float u_audio_bass; float u_audio_mid; float u_audio_treble; float u_audio_beat; float4 param_color_a; float4 param_color_b; float param_scale; float param_stretch_x; float param_stretch_y; float param_distance; float param_phase; float param_speed; float param_seed; float u_quality_samples; // AQ-Variante (Backend-Bindung) float _pad0; // 16-Byte-Alignment float _pad1; // 16-Byte-Alignment }; float hash21(float2 p) { p = frac(p * float2(123.34, 456.21)); p += dot(p, p + 45.32); return frac(p.x * p.y); } float4 mainPS(float4 pos : SV_POSITION, float2 uv : TEXCOORD0) : SV_Target { float2 p = (uv - 0.5) * param_scale; p.x *= param_stretch_x; p.y *= param_stretch_y; float t = u_time_seconds * param_speed + param_phase; float terms = clamp(u_quality_samples, 1.0, 8.0); float v = 0.0; [loop] for (int i = 0; i < 8; i++) { if (float(i) >= terms) { break; } float fi = float(i + 1); v += sin(p.x * fi + t * fi * 0.5 + param_seed) * sin(p.y * fi * 1.3 - t * fi * 0.3 + param_seed * 2.0); v += sin(length(p) * fi * 0.7 + t * 0.8 + param_seed); } v /= terms; v = v * 0.5 + 0.5; float d = length(p) * param_distance; v += 0.5 + 0.5 * sin(d * 3.0 - t * 1.5 + param_seed); v = saturate(v); float3 col = lerp(param_color_a.rgb, param_color_b.rgb, v); return float4(col * u_layer_opacity, u_layer_opacity); }