Files
hms-mediaengine/plugins/builtin/generators/com.hms.generator.shapes/shaders/d3d11/shapes.hlsl
T
HMS MediaEngine Agent 75ca88ddbe Phase 3: Alle 24 Pflicht-Plugins (10 Generatoren + 14 Filter, §15.1/§15.2)
- 10 Generatoren mit Manifest + HLSL + GLSL + GLES je Plugin:
  solid, gradient, checker_grid, stripes_chaser, noise_clouds
  (AQ Octaves 2/3/5), plasma, wave_bars, shapes, drops_ripples,
  starfield (AQ 32/128/512 Partikel)
- 14 Filter mit Manifest + Shader je Backend:
  transform2d (keine AQ-Geometriereduktion), color_adjust,
  gradient_map, blur_sharpen (separabel 2-Pass, AQ 5/9/17 Samples),
  pixelate_quantize, mirror_tile, kaleidoscope, wave_displace
  (Noise adaptiv, Amount unverändert), rgb_split, glow_bloom
  (Kaskade 2/4/8), edge_emboss, vignette, strobe_pulse (Safety
  clamp 2 Hz, nie durch DMX allein freischaltbar), feedback_trails
  (Double-Buffer, Clear-Trigger, §15.3)
- Uniform-Vertrag §14.4 in allen 75 Shadern; Generatoren sampeln nie
  u_input_texture; alle Filter mit mix-0-Bypass (§15.3)
- 195 parametrisierte Plugin-Tests: Manifest/Backends/DMX-Slots<=8/
  AQ>=3 Varianten/Uniform-Satz/Vollstaendigkeit exakt 10+14
- Nachtraegliche Manifest-Fixes: AQ-Bloecke fuer 4 1-Pass-Filter,
  mix-Parameter fuer feedback_trails (Slot-Overlap vermieden)
- Gesamtsuite 506 gruen, Ruff gruen
2026-09-11 01:53:48 +02:00

100 lines
3.8 KiB
HLSL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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);
}