From 21377c9e21fc501ddcbf156d979954502a1d79c4 Mon Sep 17 00:00:00 2001 From: Lemmy Date: Sat, 7 Feb 2026 22:36:03 -0500 Subject: [PATCH] wallpapaper-pixelate: fix pixels being slightly shifted at 100% progress --- Shaders/frag/wp_pixelate.frag | 23 ++++++++++++----------- Shaders/qsb/wp_pixelate.frag.qsb | Bin 5706 -> 5785 bytes 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Shaders/frag/wp_pixelate.frag b/Shaders/frag/wp_pixelate.frag index 0e6101b23..32ac40e1f 100644 --- a/Shaders/frag/wp_pixelate.frag +++ b/Shaders/frag/wp_pixelate.frag @@ -98,18 +98,19 @@ void main() { // Triangle wave: pixelation peaks at progress=0.5 float pixelIntensity = 1.0 - abs(2.0 * ubuf.progress - 1.0); - // Block size ramps from 1 pixel to maxBlockSize at peak, then back down - float blockSize = max(1.0, ubuf.maxBlockSize * pixelIntensity); + // Compute the sampling UV — snap to block grid when pixelating, pass through otherwise + vec2 sampleUV = uv; + if (pixelIntensity > 0.001) { + float blockSize = ubuf.maxBlockSize * pixelIntensity; + vec2 screenSize = vec2(ubuf.screenWidth, ubuf.screenHeight); + vec2 pixelCoord = uv * screenSize; + vec2 snappedPixel = floor(pixelCoord / blockSize) * blockSize + blockSize * 0.5; + sampleUV = snappedPixel / screenSize; + } - // Snap UV to block grid in pixel space - vec2 screenSize = vec2(ubuf.screenWidth, ubuf.screenHeight); - vec2 pixelCoord = uv * screenSize; - vec2 snappedPixel = floor(pixelCoord / blockSize) * blockSize + blockSize * 0.5; - vec2 snappedUV = snappedPixel / screenSize; - - // Sample both textures at the snapped (pixelated) UV - vec4 color1 = sampleWithFillMode(source1, snappedUV, ubuf.imageWidth1, ubuf.imageHeight1, ubuf.isSolid1, ubuf.solidColor1); - vec4 color2 = sampleWithFillMode(source2, snappedUV, ubuf.imageWidth2, ubuf.imageHeight2, ubuf.isSolid2, ubuf.solidColor2); + // Sample both textures at the (possibly snapped) UV + vec4 color1 = sampleWithFillMode(source1, sampleUV, ubuf.imageWidth1, ubuf.imageHeight1, ubuf.isSolid1, ubuf.solidColor1); + vec4 color2 = sampleWithFillMode(source2, sampleUV, ubuf.imageWidth2, ubuf.imageHeight2, ubuf.isSolid2, ubuf.solidColor2); // Crossfade concentrated around the peak pixelation (progress ~0.5) float blend = smoothstep(0.4, 0.6, ubuf.progress); diff --git a/Shaders/qsb/wp_pixelate.frag.qsb b/Shaders/qsb/wp_pixelate.frag.qsb index bde6917d78a083b725335fc5ca8672fe7330fdef..9751a0fb0b403bf10201547bd74287bcf0e89b8f 100644 GIT binary patch literal 5785 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