QGLWidget и аппаратное ускорение? - PullRequest
9 голосов
/ 01 июля 2010

Приветствую всех,

Использует ли простой подкласс QGLWidget и переопределение paintEvent () OpenGL и аппаратное ускорение?Я создаю QPainter и рисую QImages в этом paintEvent ().

Что происходит внутри метода paintEvent () QGLWidget?Преобразует ли оно изображения (QImage, QPixmap) в текстуры OpenGL?

Использует ли оно аппаратное ускорение для масштабирования изображения?

Заранее спасибо, umanga

Ответы [ 2 ]

13 голосов
/ 01 июля 2010

Посмотрите на 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, они действительно нарисованы с использованием текстур.

6 голосов
/ 01 июля 2010

Да, если вы используете команды GL внутри QGLWidget, внутри методов paintGL, resizeGL и initializeGL, вы получите полное аппаратное ускорение (если доступно).

Также кажется, что использование QPainter в QGLWidget также приводитHW ускорение, поскольку есть реализация OpenGL QPainEngine, вы можете прочитать об этом здесь .

...