add multipass for faster blur

This commit is contained in:
pythongosssss
2026-01-31 16:30:00 -08:00
parent 292a5918f4
commit 7c1f02d1fa
2 changed files with 116 additions and 21 deletions

View File

@@ -1,4 +1,5 @@
#version 300 es
#pragma passes 2
precision highp float;
// Blur type constants
@@ -14,6 +15,7 @@ uniform sampler2D u_image0;
uniform vec2 u_resolution;
uniform int u_int0; // Blur type (BLUR_GAUSSIAN, BLUR_BOX, BLUR_RADIAL)
uniform float u_float0; // Blur radius/amount
uniform int u_pass; // Pass index (0 = horizontal, 1 = vertical)
in vec2 v_texCoord;
layout(location = 0) out vec4 fragColor0;
@@ -26,8 +28,14 @@ void main() {
vec2 texelSize = 1.0 / u_resolution;
float radius = max(u_float0, 0.0);
// Radial (angular) blur with incremental rotation
// Radial (angular) blur - single pass, doesn't use separable
if (u_int0 == BLUR_RADIAL) {
// Only execute on first pass
if (u_pass > 0) {
fragColor0 = texture(u_image0, v_texCoord);
return;
}
vec2 center = vec2(0.5);
vec2 dir = v_texCoord - center;
float dist = length(dir);
@@ -68,7 +76,7 @@ void main() {
return;
}
// Gaussian / Box blur (grid sampling)
// Separable Gaussian / Box blur
int samples = int(ceil(radius));
if (samples == 0) {
@@ -76,27 +84,27 @@ void main() {
return;
}
// Direction: pass 0 = horizontal, pass 1 = vertical
vec2 dir = (u_pass == 0) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
vec4 color = vec4(0.0);
float totalWeight = 0.0;
float sigma = radius / 2.0;
for (int x = -samples; x <= samples; x++) {
for (int y = -samples; y <= samples; y++) {
vec2 offset = vec2(float(x), float(y)) * texelSize;
vec4 sample_color = texture(u_image0, v_texCoord + offset);
for (int i = -samples; i <= samples; i++) {
vec2 offset = dir * float(i) * texelSize;
vec4 sample_color = texture(u_image0, v_texCoord + offset);
float weight;
if (u_int0 == BLUR_GAUSSIAN) {
float dist = length(vec2(float(x), float(y)));
weight = gaussian(dist, sigma);
} else {
// BLUR_BOX
weight = 1.0;
}
color += sample_color * weight;
totalWeight += weight;
float weight;
if (u_int0 == BLUR_GAUSSIAN) {
weight = gaussian(float(i), sigma);
} else {
// BLUR_BOX
weight = 1.0;
}
color += sample_color * weight;
totalWeight += weight;
}
fragColor0 = color / totalWeight;