Skip to content

Commit 2c0ca69

Browse files
committed
[图形模块]: 修复高DPI显示和图像加载问题
- **缩放计算**:在OpenGL和RHI视图中修复缩放因子计算,增加设备像素比率支持 - **图像加载**:统一处理空URL和加载失败情况,空URL时使用空白图像,加载失败时显示警告 - **混合设置**:在RHI渲染器中添加Alpha混合配置,支持透明图像正确显示 - **纹理格式**:将RHI纹理格式改为RGBA8888,移除预乘Alpha处理 - **视口设置**:在RHI渲染时考虑设备像素比率,修正高DPI显示 - **代码优化**:简化图像加载逻辑,移除重复代码,改进错误处理 - **拖放事件**:更新拖放事件处理,使用自动类型推导
1 parent 4551ee3 commit 2c0ca69

5 files changed

Lines changed: 45 additions & 31 deletions

File tree

src/gpugraphics/openglview.cc

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ class OpenglView::OpenglViewPrivate
8383
void emitScaleFactor()
8484
{
8585
updateTransform();
86-
auto factor = transform.toTransform().m11() * windowSize.width() / image.width();
86+
auto factor = transform.toTransform().m11() * windowSize.width()
87+
* q_ptr->devicePixelRatioF() / image.width();
8788
emit q_ptr->scaleFactorChanged(factor);
8889
}
8990

@@ -147,13 +148,13 @@ OpenglView::~OpenglView()
147148
void OpenglView::setImageUrl(const QString &imageUrl)
148149
{
149150
QImage image;
150-
if (!Utils::ImageCache::instance()->find(imageUrl, image)) {
151-
if (!imageUrl.isEmpty()) {
152-
QMessageBox::warning(this,
153-
tr("WARNING"),
154-
tr("Picture failed to open, Url: %1!").arg(imageUrl));
155-
}
151+
if (imageUrl.isEmpty()) {
156152
image = emptyImage();
153+
} else if (!Utils::ImageCache::instance()->find(imageUrl, image)) {
154+
QMessageBox::warning(this,
155+
tr("WARNING"),
156+
tr("Picture failed to open, Url: %1!").arg(imageUrl));
157+
return;
157158
}
158159

159160
d_ptr->image = image.convertedTo(QImage::Format_RGBA8888_Premultiplied);

src/gpugraphics/rhiview.cc

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ class RhiView::RhiViewPrivate
5757
scene.ps->setDepthTest(true);
5858
scene.ps->setDepthWrite(true);
5959
// scene.ps->setCullMode(QRhiGraphicsPipeline::Back);
60+
QRhiGraphicsPipeline::TargetBlend blend;
61+
blend.enable = true;
62+
blend.srcColor = QRhiGraphicsPipeline::SrcAlpha;
63+
blend.dstColor = QRhiGraphicsPipeline::OneMinusSrcAlpha;
64+
blend.srcAlpha = QRhiGraphicsPipeline::One;
65+
blend.dstAlpha = QRhiGraphicsPipeline::OneMinusSrcAlpha;
66+
scene.ps->setTargetBlends({blend});
67+
6068
scene.ps->setShaderStages(
6169
{{QRhiShaderStage::Vertex, getShader(QLatin1String("://shader/vulkan.vert.qsb"))},
6270
{QRhiShaderStage::Fragment, getShader(QLatin1String("://shader/vulkan.frag.qsb"))}});
@@ -75,8 +83,8 @@ class RhiView::RhiViewPrivate
7583

7684
void initTexture()
7785
{
78-
scene.cubeTex.reset(rhi->newTexture(QRhiTexture::RGBA8, image.size()));
79-
scene.cubeTex->create();
86+
scene.texture.reset(rhi->newTexture(QRhiTexture::RGBA8, image.size()));
87+
scene.texture->create();
8088

8189
scene.srb.reset(rhi->newShaderResourceBindings());
8290
scene.srb->setBindings(
@@ -85,9 +93,9 @@ class RhiView::RhiViewPrivate
8593
scene.ubuf.get()),
8694
QRhiShaderResourceBinding::sampledTexture(1,
8795
QRhiShaderResourceBinding::FragmentStage,
88-
scene.cubeTex.get(),
96+
scene.texture.get(),
8997
scene.sampler.get())});
90-
scene.srb->create();
98+
qInfo() << "srb create:" << scene.srb->create();
9199

92100
scene.ps->destroy();
93101
scene.ps->setShaderResourceBindings(scene.srb.get());
@@ -100,7 +108,7 @@ class RhiView::RhiViewPrivate
100108
{
101109
if (!scene.resourceUpdates)
102110
scene.resourceUpdates = rhi->nextResourceUpdateBatch();
103-
scene.resourceUpdates->uploadTexture(scene.cubeTex.get(), image);
111+
scene.resourceUpdates->uploadTexture(scene.texture.get(), image);
104112
}
105113

106114
void updateTransform()
@@ -125,7 +133,8 @@ class RhiView::RhiViewPrivate
125133
void emitScaleFactor()
126134
{
127135
updateTransform();
128-
auto factor = transform.toTransform().m11() * windowSize.width() / image.width();
136+
auto factor = transform.toTransform().m11() * windowSize.width()
137+
* q_ptr->devicePixelRatioF() / image.width();
129138
emit q_ptr->scaleFactorChanged(factor);
130139
}
131140

@@ -144,7 +153,7 @@ class RhiView::RhiViewPrivate
144153
std::unique_ptr<QRhiShaderResourceBindings> srb;
145154
std::unique_ptr<QRhiGraphicsPipeline> ps;
146155
std::unique_ptr<QRhiSampler> sampler;
147-
std::unique_ptr<QRhiTexture> cubeTex;
156+
std::unique_ptr<QRhiTexture> texture;
148157
QMatrix4x4 mvp;
149158
} scene;
150159

@@ -168,16 +177,16 @@ RhiView::~RhiView() {}
168177
void RhiView::setImageUrl(const QString &imageUrl)
169178
{
170179
QImage image;
171-
if (!Utils::ImageCache::instance()->find(imageUrl, image)) {
172-
if (!imageUrl.isEmpty()) {
173-
QMessageBox::warning(this,
174-
tr("WARNING"),
175-
tr("Picture failed to open, Url: %1!").arg(imageUrl));
176-
}
180+
if (imageUrl.isEmpty()) {
177181
image = emptyImage();
182+
} else if (!Utils::ImageCache::instance()->find(imageUrl, image)) {
183+
QMessageBox::warning(this,
184+
tr("WARNING"),
185+
tr("Picture failed to open, Url: %1!").arg(imageUrl));
186+
return;
178187
}
179188

180-
d_ptr->image = image.convertToFormat(QImage::Format_RGBA8888_Premultiplied);
189+
d_ptr->image = image.convertToFormat(QImage::Format_RGBA8888);
181190
d_ptr->initTexture();
182191

183192
auto size = d_ptr->image.size();
@@ -273,7 +282,8 @@ void RhiView::render(QRhiCommandBuffer *cb)
273282
cb->beginPass(renderTarget(), d_ptr->backgroundColor, {1.0f, 0}, resourceUpdates);
274283

275284
cb->setGraphicsPipeline(d_ptr->scene.ps.get());
276-
cb->setViewport(QRhiViewport(0, 0, width(), height()));
285+
cb->setViewport(
286+
QRhiViewport(0, 0, width() * devicePixelRatioF(), height() * devicePixelRatioF()));
277287
cb->setShaderResources();
278288

279289
const QRhiCommandBuffer::VertexInput vbufBinding(d_ptr->scene.vbuf.get(), 0);

src/gpugraphics/vulkanrenderer.cc

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,15 +438,18 @@ VulkanRenderer::VulkanRenderer(QVulkanWindow *vulkanWindow)
438438

439439
VulkanRenderer::~VulkanRenderer() = default;
440440

441-
auto VulkanRenderer::createTexture(const QString &name, bool &img) -> bool
441+
auto VulkanRenderer::createTexture(const QString &imageUrl, bool &img) -> bool
442442
{
443443
QImage image;
444-
img = Utils::ImageCache::instance()->find(name, image);
445-
if (!img) {
446-
if (!name.isEmpty()) {
447-
qWarning("Failed to load image %s", qPrintable(name));
448-
}
444+
if (imageUrl.isEmpty()) {
449445
image = emptyImage();
446+
img = true;
447+
} else {
448+
img = Utils::ImageCache::instance()->find(imageUrl, image);
449+
if (!img) {
450+
qWarning("Failed to load image %s", qPrintable(imageUrl));
451+
return false;
452+
}
450453
}
451454

452455
// Convert to byte ordered RGBA8. Use premultiplied alpha, see

src/gpugraphics/vulkanrenderer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class GPUAPHICS VulkanRenderer : public QVulkanWindowRenderer
3838
void createVertexBuffer();
3939
void createIndexBuffer();
4040
void createUniformBuffers();
41-
auto createTexture(const QString &name, bool &img) -> bool;
41+
auto createTexture(const QString &imageUrl, bool &img) -> bool;
4242
void createTextureImageView();
4343
void createDescriptorPool();
4444
void createDescriptorSets();

src/graphics/imageview.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ void ImageView::dragMoveEvent(QDragMoveEvent *event)
296296
void ImageView::dropEvent(QDropEvent *event)
297297
{
298298
QGraphicsView::dropEvent(event);
299-
const QList<QUrl> urls = event->mimeData()->urls();
299+
const auto urls = event->mimeData()->urls();
300300
if (urls.isEmpty()) {
301301
return;
302302
}
@@ -407,7 +407,7 @@ void ImageView::drawCrossLine(QPainter *painter)
407407
void ImageView::emitScaleFactor()
408408
{
409409
// get scale factor directly from the transform matrix
410-
qreal factor = transform().m11();
410+
qreal factor = transform().m11() * devicePixelRatioF();
411411
emit scaleFactorChanged(factor);
412412
}
413413

0 commit comments

Comments
 (0)