From 4b93e5fd7bc5c7974f1eba3ed70ec3340fff60e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Sep 2025 02:51:53 +0000 Subject: [PATCH] Fix blur size independence from sample count Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- .../frontend/src/utility/image-effector/fxs/blur.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/utility/image-effector/fxs/blur.ts b/packages/frontend/src/utility/image-effector/fxs/blur.ts index 1e78df16b8..144e3f39fc 100644 --- a/packages/frontend/src/utility/image-effector/fxs/blur.ts +++ b/packages/frontend/src/utility/image-effector/fxs/blur.ts @@ -22,17 +22,23 @@ void main() { float totalSamples = 0.0; // Simple box blur with configurable sample count - // Based on the original cross pattern but with more samples + // The radius controls visual blur size, samples controls quality within that radius int samples = min(u_samples, 128); float radius = u_radius; // Calculate how many samples to take in each direction + // This determines the grid density, not the blur extent int sampleRadius = int(sqrt(float(samples)) / 2.0); - // Sample in a grid pattern around the center + // Sample in a grid pattern within the specified radius for (int x = -sampleRadius; x <= sampleRadius; x++) { for (int y = -sampleRadius; y <= sampleRadius; y++) { - vec2 offset = vec2(float(x), float(y)) * texelSize * radius; + // Normalize the grid position to [-1, 1] range + float normalizedX = float(x) / float(sampleRadius); + float normalizedY = float(y) / float(sampleRadius); + + // Scale by radius to get the actual sampling offset + vec2 offset = vec2(normalizedX, normalizedY) * texelSize * radius; vec2 sampleUV = in_uv + offset; // Only sample if within texture bounds