QGLWidget и аппаратное ускорение?

Поздравления все,

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

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

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

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

9
задан Greg S 13 July 2010 в 12:12
поделиться

2 ответа

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

13
ответ дан 4 December 2019 в 11:03
поделиться

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

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

6
ответ дан 4 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: