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

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

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

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

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

Заранее спасибо, Уманга


person Ashika Umanga Umagiliya    schedule 01.07.2010    source источник
comment
Выглядит очень маловероятным. Из документов - за исключением того, что вместо рисования содержимого виджета с помощью QPainter и т. д. вы используете стандартные команды рендеринга OpenGL.   -  person tathagata    schedule 01.07.2010
comment
@tathagata: к сожалению, вы ошибаетесь, несмотря на голосование; пожалуйста, прочитайте мой ответ на вопрос.   -  person Greg S    schedule 01.07.2010
comment
Спасибо, Грег, за указание на это! Я просто сделал логическое предположение. Думаю, я был неправ.   -  person tathagata    schedule 01.07.2010


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

person Greg S    schedule 01.07.2010

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

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

person Dr. Snoopy    schedule 01.07.2010