【问题标题】:QGLWidget and hardware acceleration?QGLWidget 和硬件加速?
【发布时间】:2011-03-10 12:52:23
【问题描述】:

大家好,

简单地继承 QGLWidget 并重新实现 paintEvent() 是否使用 OpenGL 和硬件加速? 我创建了一个 QPainter 并在这个 paintEvent() 中绘制 QImages。

QGLWidget 的paintEvent() 方法内部发生了什么?是否将图像(QImage,QPixmap) 转换为 OpenGL 纹理?

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

提前致谢, 漫画

【问题讨论】:

  • 看起来不太可能。来自文档 - 除了使用标准 OpenGL 渲染命令而不是使用 QPainter 等绘制小部件的内容。
  • @tathagata:不幸的是你错了,尽管赞成;请阅读我对问题的回答。
  • 感谢格雷格指出这一点!我只是在做一个合乎逻辑的猜测。我猜我错了。

标签: qt opengl qt4 hardware-acceleration qglwidget


【解决方案1】:

查看http://doc.qt.io/archives/4.6/opengl-2dpainting.html 以获取一个有启发性的示例,您还可以在其中找到以下引用:“可以重新实现其 [QGLWidget] paintEvent() 并使用 QPainter 在设备上绘图,就像你会使用 QWidget。唯一的区别是,如果你的系统的 OpenGL 驱动程序支持绘画操作,它将在硬件中加速。"

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

为了弄清楚具体的实现细节,让我们快速浏览一下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 的问题,它们确实是使用纹理绘制的。

【讨论】:

    【解决方案2】:

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

    似乎在 QGLWidget 中使用 QPainter 也可以获得硬件加速,因为有一个 OpenGL QPainEngine 实现,你可以阅读here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多