summaryrefslogtreecommitdiff
path: root/src/shaders/postprocess_inline.wgsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/shaders/postprocess_inline.wgsl')
-rw-r--r--src/shaders/postprocess_inline.wgsl61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/shaders/postprocess_inline.wgsl b/src/shaders/postprocess_inline.wgsl
new file mode 100644
index 0000000..84ef3d3
--- /dev/null
+++ b/src/shaders/postprocess_inline.wgsl
@@ -0,0 +1,61 @@
+// Inline post-process functions for simple effects
+// Use these instead of separate effect classes for v2 sequences
+
+// Vignette: darkens edges based on distance from center
+fn apply_vignette(color: vec4f, uv: vec2f, radius: f32, softness: f32, intensity: f32) -> vec4f {
+ let d = distance(uv, vec2f(0.5, 0.5));
+ let vignette = smoothstep(radius, radius - softness, d);
+ return vec4f(color.rgb * mix(1.0, vignette, intensity), color.a);
+}
+
+// Flash: additive white flash
+fn apply_flash(color: vec4f, flash_intensity: f32) -> vec4f {
+ return color + vec4f(flash_intensity, flash_intensity, flash_intensity, 0.0);
+}
+
+// Fade: linear interpolation to target color
+fn apply_fade(color: vec4f, fade_amount: f32, fade_color: vec3f) -> vec4f {
+ return vec4f(mix(color.rgb, fade_color, fade_amount), color.a);
+}
+
+// Theme modulation: multiply by color tint
+fn apply_theme(color: vec4f, theme_color: vec3f, strength: f32) -> vec4f {
+ return vec4f(mix(color.rgb, color.rgb * theme_color, strength), color.a);
+}
+
+// Solarize: threshold-based color inversion
+fn apply_solarize(color: vec4f, threshold: f32, strength: f32, time: f32) -> vec4f {
+ let pattern_num = u32(time / 2.0);
+ let is_even = (pattern_num % 2u) == 0u;
+ let thr = threshold + 0.15 * sin(time);
+ var col = color;
+
+ if (is_even) {
+ if (col.r < thr) { col.r = mix(col.r, 1.0 - col.r, strength); }
+ if (col.g < thr) { col.g = mix(col.g, 1.0 - col.g * 0.7, strength * 0.7); }
+ if (col.b < thr) { col.b = mix(col.b, col.b * 0.5, strength); }
+ } else {
+ if (col.r < thr) { col.r = mix(col.r, col.r * 0.6, strength); }
+ if (col.g < thr) { col.g = mix(col.g, 1.0 - col.g * 0.8, strength * 0.8); }
+ if (col.b < thr) { col.b = mix(col.b, 1.0 - col.b, strength); }
+ }
+ return col;
+}
+
+// Chroma aberration: RGB channel offset
+fn apply_chroma_aberration(input_tex: texture_2d<f32>, input_sampler: sampler,
+ uv: vec2f, offset: f32, resolution: vec2f) -> vec4f {
+ let pixel_offset = offset / resolution;
+ let r = textureSample(input_tex, input_sampler, uv + vec2f(pixel_offset.x, 0.0)).r;
+ let g = textureSample(input_tex, input_sampler, uv).g;
+ let b = textureSample(input_tex, input_sampler, uv - vec2f(pixel_offset.x, 0.0)).b;
+ let a = textureSample(input_tex, input_sampler, uv).a;
+ return vec4f(r, g, b, a);
+}
+
+// Distort: UV distortion based on time
+fn apply_distort(uv: vec2f, time: f32, strength: f32) -> vec2f {
+ let distort_x = sin(uv.y * 10.0 + time * 2.0) * strength;
+ let distort_y = cos(uv.x * 10.0 + time * 2.0) * strength;
+ return uv + vec2f(distort_x, distort_y);
+}