QGLWidget和硬件加速?

9

大家好,

仅仅通过继承QGLWidget并重新实现paintEvent()方法,就能够使用OpenGL和硬件加速吗? 我创建了一个QPainter对象,并在该paintEvent()方法中绘制QImages。

在QGLWidget的paintEvent()方法内部会发生什么?它会将图像(QImage、QPixmap)转换为OpenGL纹理吗?

它是否使用硬件加速进行图像缩放?

提前感谢, umanga


1
看起来很不可能。根据文档,除了使用QPainter等绘制小部件的内容之外,您可以使用标准的OpenGL渲染命令。 - tathagata
2
@tathagata:很遗憾,尽管您得到了赞同,但您是错误的,请阅读我的回答来回答这个问题。 - Greg S
谢谢Greg指出这一点!我只是在做一个逻辑猜测。看来我错了。 - tathagata
2个回答

13

请查看http://doc.qt.io/archives/4.6/opengl-2dpainting.html,这是一个很好的例子,你可以在里面找到以下引用:“如果支持系统的OpenGL驱动程序,就可以重新实现其[QGLWidget] paintEvent()并使用QPainter在设备上绘制,就像使用QWidget一样。唯一的区别是如果系统支持硬件加速,则绘图操作将在硬件上加速。”

所以,对于你的第一个问题,答案是肯定的。

要了解实现的确切细节,让我们快速查看一下来自QOpenGLPaintEngine的源代码片段(可以通过搜索互联网找到):

void QOpenGLPaintEngine::drawImage(const QRectF &r, const QImage &image, 
                              const QRectF &sr, Qt::ImageConversionFlags)
{
    Q_D(QOpenGLPaintEngine);
    if (d->composition_mode > QPainter::CompositionMode_Plus 
         || d->high_quality_antialiasing && !d->isFastRect(r))
        d->drawImageAsPath(r, image, sr);
    else {
        GLenum target = (QGLExtensions::glExtensions 
                         & QGLExtensions::TextureRectangle)
                        ? GL_TEXTURE_RECTANGLE_NV
                        : GL_TEXTURE_2D;
        if (r.size() != image.size())
            target = GL_TEXTURE_2D;
        d->flushDrawQueue();
        d->drawable.bindTexture(image, target);
        drawTextureRect(image.width(), image.height(), r, sr, target);
    }
}

这篇回答解决了你关于QImages的问题,它们确实是使用纹理绘制的。


6

如果您在QGLWidget的paintGL、resizeGL和initializeGL方法中使用GL命令,则可以获得完全的硬件加速(如果可用)。

似乎在QGLWidget中使用QPainter也会获得硬件加速,因为有一个OpenGL QPaintEngine实现,您可以在此处阅读有关该实现的更多信息here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接