问候所有人,
简单地继承QGLWidget并重新实现paintEvent()是否可以利用OpenGL和硬件加速? 我创建了一个QPainter并在这个paintEvent()中绘制QImages。
QGLWidget的paintEvent()方法中发生了什么?它是否将图像(QImage,QPixmap)转换为OpenGL纹理?
它是否使用硬件加速进行图像缩放?
提前致谢, umanga
答案 0 :(得分:13)
看看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的问题,它们确实是使用纹理绘制的。
答案 1 :(得分:6)
是的,如果您在QGLWidget中使用GL命令,在paintGL,resizeGL和initializeGL方法中,您将获得完整的硬件加速(如果可用)。
似乎在QGLWidget中使用QPainter也会获得硬件加速,因为有一个OpenGL QPainEngine实现,你可以阅读here。