summaryrefslogtreecommitdiff
path: root/rust/crates/gpu/src/shaders/gaussian_blur.wgsl
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-01 13:57:32 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-01 13:57:32 +0200
commite579ae120290329fd697b50ea9138ffccb65a805 (patch)
tree12a63ee60b00e5004a1806ddf3ebd70c012e3e28 /rust/crates/gpu/src/shaders/gaussian_blur.wgsl
parentb048b739bd598f9d9ff97166f29bcb6e37c40607 (diff)
downloadopencut-e579ae120290329fd697b50ea9138ffccb65a805.tar.gz
feat: migrate GPU renderer from WebGL to wgpu/WASM
Diffstat (limited to 'rust/crates/gpu/src/shaders/gaussian_blur.wgsl')
-rw-r--r--rust/crates/gpu/src/shaders/gaussian_blur.wgsl34
1 files changed, 34 insertions, 0 deletions
diff --git a/rust/crates/gpu/src/shaders/gaussian_blur.wgsl b/rust/crates/gpu/src/shaders/gaussian_blur.wgsl
new file mode 100644
index 00000000..6c8d311d
--- /dev/null
+++ b/rust/crates/gpu/src/shaders/gaussian_blur.wgsl
@@ -0,0 +1,34 @@
+struct VertexOutput {
+ @builtin(position) position: vec4f,
+ @location(0) tex_coord: vec2f,
+}
+
+struct EffectUniforms {
+ resolution: vec2f,
+ direction: vec2f,
+ scalars: vec4f,
+}
+
+@group(0) @binding(0) var input_texture: texture_2d<f32>;
+@group(0) @binding(1) var input_sampler: sampler;
+@group(1) @binding(0) var<uniform> uniforms: EffectUniforms;
+
+@fragment
+fn fragment_main(input: VertexOutput) -> @location(0) vec4f {
+ let texel_size = vec2f(1.0, 1.0) / uniforms.resolution;
+ let sigma = uniforms.scalars.x;
+ let step_size = uniforms.scalars.y;
+
+ var color = vec4f(0.0, 0.0, 0.0, 0.0);
+ var total_weight = 0.0;
+
+ for (var index = -30; index <= 30; index = index + 1) {
+ let position = f32(index) * step_size;
+ let weight = exp(-(position * position) / (2.0 * sigma * sigma));
+ let sample_uv = input.tex_coord + (texel_size * uniforms.direction * position);
+ color = color + textureSample(input_texture, input_sampler, sample_uv) * weight;
+ total_weight = total_weight + weight;
+ }
+
+ return color / total_weight;
+}