2010-07-01 2 views
9

Приветствия все,QGLWidget и аппаратное ускорение?

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

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

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

Спасибо заранее, umanga

+1

Выглядит очень маловероятно. Из документов - за исключением того, что вместо рисования содержимого виджета с помощью QPainter и т. Д. Вы используете стандартные команды рендеринга OpenGL. – tathagata

+2

@tathagata: к сожалению, вы ошибаетесь, несмотря на upvote; пожалуйста, прочитайте мой ответ на вопрос. –

+0

Спасибо, Грег, за это! Я просто догадывался. Думаю, я был неправ. – tathagata

ответ

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

+0

Большое спасибо Грегу! что очистило мои сомнения. –

+3

Преимущества open source! –

6

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

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

Смежные вопросы