Поздравления все,
Просто разделение на подклассы QGLWidget и перереализация paintEvent () используют OpenGL и аппаратное ускорение? Я создаю QPainter и тяну QImages в этом paintEvent ().
Что происходит в paintEvent () метод QGLWidget? Это преобразовывает изображения (QImage, QPixmap) в структуры OpenGL?
Это использует аппаратное ускорение для масштабирования изображения?
Заранее спасибо, umanga
Взгляните на 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, они действительно нарисованы с использованием текстур.
Да, если вы используете команды GL внутри QGLWidget, внутри методов paintGL, resizeGL и initializeGL, вы получите полное аппаратное ускорение (если доступно).
Также кажется, что использование QPainter в QGLWidget также увеличивает аппаратное ускорение, поскольку существует реализация OpenGL QPainEngine, вы можете прочитать об этом здесь .