From 03d32b1368601556215ef95b3e93756fdb8637f6 Mon Sep 17 00:00:00 2001 From: Lemmy Date: Tue, 24 Mar 2026 19:39:18 -0400 Subject: [PATCH] fix(shader): uv clamping NImageRounded. Fix #2288 --- Shaders/frag/rounded_image.frag | 9 ++++++--- Shaders/qsb/rounded_image.frag.qsb | Bin 4113 -> 4070 bytes 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Shaders/frag/rounded_image.frag b/Shaders/frag/rounded_image.frag index 164906d92..dc5c4f91b 100644 --- a/Shaders/frag/rounded_image.frag +++ b/Shaders/frag/rounded_image.frag @@ -90,9 +90,12 @@ void main() { float alpha = 1.0 - smoothstep(-0.5, 0.5, distance); // Sample the texture (or use transparent for letterbox) - vec4 color = inLetterbox ? vec4(0.0) : texture(source, imageUV); + // Clamp UV to prevent texture wrapping artifacts from floating-point imprecision + vec4 color = inLetterbox ? vec4(0.0) : texture(source, clamp(imageUV, vec2(0.0), vec2(1.0))); // Apply the rounded mask and opacity - float finalAlpha = color.a * alpha * itemOpacity * ubuf.qt_Opacity; - fragColor = vec4(color.rgb * finalAlpha, finalAlpha); + // Qt textures use premultiplied alpha (color.rgb already contains rgb * alpha), + // so we only multiply by the external mask factors, not by color.a again + float mask = alpha * itemOpacity * ubuf.qt_Opacity; + fragColor = color * mask; } \ No newline at end of file diff --git a/Shaders/qsb/rounded_image.frag.qsb b/Shaders/qsb/rounded_image.frag.qsb index b0efbb83ca456e212e37972375f216bd54be6e3a..8942a675b90bf17be4cb1b7d913b6af6361ec76b 100644 GIT binary patch literal 4070 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 literal 4113 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 P{i%d`5uE-F>oD`KHOXkE