// Shapes 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_form; float param_count; float param_size; float param_rotation; float param_distribution; float param_fill_stroke; 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); } float sdCircle(float2 p, float r) { return length(p) - r; } float sdBox(float2 p, float2 b) { float2 d = abs(p) - b; return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); } float sdTri(float2 p, float s) { p = abs(p); return max(p.x * 0.8660254 + p.y * 0.5, -p.y) - s * 0.5; } float sdLine(float2 p, float2 a, float2 b) { float2 pa = p - a; float2 ba = b - a; float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0); return length(pa - ba * h); } float sdPoly(float2 p, float r, int n) { float an = 6.2831853 / float(n); float a = atan2(p.x, p.y) + 0.5; float b = an * floor(a / an); float2 q = float2(cos(b), sin(b)) * dot(float2(cos(a), sin(a)), float2(cos(b), sin(b))); return length(p - q * r); } float4 mainPS(float4 pos : SV_POSITION, float2 uv : TEXCOORD0) : SV_Target { float2 p = uv - 0.5; float t = u_time_seconds; float maxN = clamp(u_quality_samples, 1.0, 64.0); float form = floor(param_form + 0.5); float distr = floor(param_distribution + 0.5); float fill = floor(param_fill_stroke + 0.5); float acc = 0.0; float colAcc = 0.0; [loop] for (int i = 0; i < 64; i++) { if (float(i) >= maxN) { break; } float2 pos; if (distr < 0.5) { float g = ceil(sqrt(maxN)); float gx = float(i % int(g)); float gy = floor(float(i) / g); pos = (float2(gx, gy) + 0.5) / g - 0.5; } else if (distr < 1.5) { float ang = 6.2831853 * float(i) / maxN; pos = 0.35 * float2(cos(ang), sin(ang)); } else { pos = float2(hash21(float2(float(i) + param_seed, 1.0)), hash21(float2(float(i) + param_seed, 2.0))) - 0.5; } float2 lp = p - pos; float cr = cos(param_rotation); float sr = sin(param_rotation); lp = float2(cr * lp.x - sr * lp.y, sr * lp.x + cr * lp.y); float d; if (form < 0.5) { d = sdCircle(lp, param_size); } else if (form < 1.5) { d = sdBox(lp, float2(param_size, param_size)); } else if (form < 2.5) { d = sdTri(lp, param_size); } else if (form < 3.5) { d = sdLine(lp, float2(-param_size, 0.0), float2(param_size, 0.0)); } else { d = sdPoly(lp, param_size, 6); } float v; if (fill < 0.5) { v = 1.0 - smoothstep(0.0, 0.01, d); } else { v = 1.0 - smoothstep(0.0, 0.01, abs(d) - 0.01); } acc += v; colAcc += v * (float(i) / max(maxN - 1.0, 1.0)); } acc = saturate(acc); float mixT = maxN > 1.0 ? colAcc / max(acc, 1e-5) : 0.0; float3 col = lerp(param_color_a.rgb, param_color_b.rgb, mixT); return float4(col * acc * u_layer_opacity, acc * u_layer_opacity); }