From f117277eda0d77f599d94b99a9a5288dfec6e534 Mon Sep 17 00:00:00 2001 From: zhangkun2 Date: Fri, 11 Sep 2026 19:30:43 +0800 Subject: [PATCH] fix: use min() for mask alpha and fix HiDPI border width MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Replace RGBA vector multiplication with min() for mask alpha composition in ItemViewport shaders, preventing squared alpha attenuation at anti-aliased rounded corners 2. Fix Qt5 shaders that still had double alpha multiplication (tex * tex.a) from previous incomplete fix 3. Divide borderWidth by Screen.devicePixelRatio in OutsideBoxBorder and InsideBoxBorder QML to ensure consistent 1px border across different display scaling factors Log: Fix dark corner artifacts and scaling-dependent border thickness in ItemViewport Influence: 1. Verify popup rounded corners show no dark artifacts under fractional scaling (125%, 150%) 2. Verify border width is consistent 1px across different display scaling settings 3. Test popup rendering on both Qt5 and Qt6 builds fix: 修复 mask alpha 合成方式和 HiDPI 边框宽度问题 1. 将 ItemViewport shader 中 mask alpha 合成从 RGBA 向量乘法改为 min() 操作,避免抗锯齿圆角边缘 alpha 二次方衰减导致的深色块 2. 修复 Qt5 shader 中残留的 tex * tex.a 双重 alpha 乘法问题 3. OutsideBoxBorder 和 InsideBoxBorder 的 borderWidth 除以 Screen.devicePixelRatio,确保不同缩放比例下边框宽度一致 Log: 修复 ItemViewport 圆角深色块和缩放相关边框宽度问题 Influence: 1. 验证弹窗圆角在分数缩放(125%、150%)下无深色块伪影 2. 验证不同显示缩放设置下边框宽度保持一致的 1px 3. 在 Qt5 和 Qt6 构建上测试弹窗渲染 PMS: BUG-306847 --- qt6/src/qml/OutsideBoxBorder.qml | 3 ++- qt6/src/shaders_ng/quickitemviewport-opaque.frag | 6 +++--- qt6/src/shaders_ng/quickitemviewport.frag | 6 +++--- src/qml/InsideBoxBorder.qml | 2 +- src/qml/OutsideBoxBorder.qml | 2 +- src/shaders/quickitemviewport-opaque.frag | 9 +++++---- src/shaders/quickitemviewport.frag | 9 +++++---- 7 files changed, 20 insertions(+), 17 deletions(-) diff --git a/qt6/src/qml/OutsideBoxBorder.qml b/qt6/src/qml/OutsideBoxBorder.qml index 04cad6821..da1cb6ab8 100644 --- a/qt6/src/qml/OutsideBoxBorder.qml +++ b/qt6/src/qml/OutsideBoxBorder.qml @@ -3,9 +3,10 @@ // SPDX-License-Identifier: LGPL-3.0-or-later import QtQuick +import QtQuick.Window Item { - property real borderWidth: 1 + property real borderWidth: 1 / Screen.devicePixelRatio property color color: "white" property real radius: 0 diff --git a/qt6/src/shaders_ng/quickitemviewport-opaque.frag b/qt6/src/shaders_ng/quickitemviewport-opaque.frag index f062bc1a9..fb50238a3 100644 --- a/qt6/src/shaders_ng/quickitemviewport-opaque.frag +++ b/qt6/src/shaders_ng/quickitemviewport-opaque.frag @@ -38,12 +38,12 @@ void main() lowp vec4 mask_bottom_left = texture(mask, tex_bottom_left); lowp vec4 mask_top_right = texture(mask, tex_top_right); lowp vec4 mask_bottom_right = texture(mask, tex_bottom_right); - lowp vec4 mask_tex = mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; + lowp float mask_alpha = min(min(mask_top_left.a, mask_bottom_left.a), min(mask_top_right.a, mask_bottom_right.a)); - if (mask_tex.a == 0.0) + if (mask_alpha == 0.0) discard; lowp vec4 tex = texture(qt_Texture, qt_TexCoord); - fragColor = tex * mask_tex.a; + fragColor = tex * mask_alpha; } diff --git a/qt6/src/shaders_ng/quickitemviewport.frag b/qt6/src/shaders_ng/quickitemviewport.frag index 83e91eed5..7985478a6 100644 --- a/qt6/src/shaders_ng/quickitemviewport.frag +++ b/qt6/src/shaders_ng/quickitemviewport.frag @@ -39,12 +39,12 @@ void main() lowp vec4 mask_bottom_left = texture(mask, tex_bottom_left); lowp vec4 mask_top_right = texture(mask, tex_top_right); lowp vec4 mask_bottom_right = texture(mask, tex_bottom_right); - lowp vec4 mask_tex = mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; + lowp float mask_alpha = min(min(mask_top_left.a, mask_bottom_left.a), min(mask_top_right.a, mask_bottom_right.a)); - if (mask_tex.a == 0.0) + if (mask_alpha == 0.0) discard; lowp vec4 tex = texture(qt_Texture, qt_TexCoord); - fragColor = tex * mask_tex.a * ubuf.opacity; + fragColor = tex * mask_alpha * ubuf.opacity; } diff --git a/src/qml/InsideBoxBorder.qml b/src/qml/InsideBoxBorder.qml index 154748db0..31bdd2730 100644 --- a/src/qml/InsideBoxBorder.qml +++ b/src/qml/InsideBoxBorder.qml @@ -5,7 +5,7 @@ import QtQuick 2.0 Item { - property real borderWidth: 1 + property real borderWidth: 1 / Screen.devicePixelRatio property color color: Qt.rgba(1, 1, 1, 0.15) property alias radius: rect.radius diff --git a/src/qml/OutsideBoxBorder.qml b/src/qml/OutsideBoxBorder.qml index 253922917..d7358f087 100644 --- a/src/qml/OutsideBoxBorder.qml +++ b/src/qml/OutsideBoxBorder.qml @@ -5,7 +5,7 @@ import QtQuick 2.0 Item { - property real borderWidth: 1 + property real borderWidth: 1 / Screen.devicePixelRatio property color color: "white" property real radius: 0 diff --git a/src/shaders/quickitemviewport-opaque.frag b/src/shaders/quickitemviewport-opaque.frag index c0e77fa09..80df98ca6 100644 --- a/src/shaders/quickitemviewport-opaque.frag +++ b/src/shaders/quickitemviewport-opaque.frag @@ -32,9 +32,10 @@ void main() lowp vec4 mask_top_right = texture2D(mask, tex_top_right); lowp vec4 mask_bottom_right = texture2D(mask, tex_bottom_right); - lowp vec4 tex = texture2D(qt_Texture, qt_TexCoord); + lowp float mask_alpha = min(min(mask_top_left.a, mask_bottom_left.a), min(mask_top_right.a, mask_bottom_right.a)); + if (mask_alpha == 0.0) + discard; - // 统一计算此像素点被模板遮盖后的颜色,此处不需要区分点是否在某个区域,不在此区域时取出的mask颜色的alpha值必为1 - tex *= mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; - gl_FragColor = tex * tex.a; + lowp vec4 tex = texture2D(qt_Texture, qt_TexCoord); + gl_FragColor = tex * mask_alpha; } diff --git a/src/shaders/quickitemviewport.frag b/src/shaders/quickitemviewport.frag index 9c966333e..9bac12421 100644 --- a/src/shaders/quickitemviewport.frag +++ b/src/shaders/quickitemviewport.frag @@ -33,9 +33,10 @@ void main() lowp vec4 mask_top_right = texture2D(mask, tex_top_right); lowp vec4 mask_bottom_right = texture2D(mask, tex_bottom_right); - lowp vec4 tex = texture2D(qt_Texture, qt_TexCoord); + lowp float mask_alpha = min(min(mask_top_left.a, mask_bottom_left.a), min(mask_top_right.a, mask_bottom_right.a)); + if (mask_alpha == 0.0) + discard; - // 统一计算此像素点被模板遮盖后的颜色,此处不需要区分点是否在某个区域,不在此区域时取出的mask颜色的alpha值必为1 - tex *= mask_top_left * mask_bottom_left * mask_top_right * mask_bottom_right; - gl_FragColor = tex * tex.a * opacity; + lowp vec4 tex = texture2D(qt_Texture, qt_TexCoord); + gl_FragColor = tex * mask_alpha * opacity; }