2010-07-01 16 views
9

Pozdrowienia wszystkie,QGLWidget i akceleracja sprzętowa?

Czy po prostu podklasy QGLWidget i reimplementing paintEvent() używają OpenGL i przyspieszenia sprzętowego? Tworzę QPainter i rysuję QImages w tym paintEvent().

Co dzieje się w metodzie paintEvent() obiektu QGLWidget? Czy przekształca obrazy (QImage, QPixmap) w tekstury OpenGL?

Czy wykorzystuje przyspieszenie sprzętowe do skalowania obrazu?

Dzięki z góry, umanga

+1

Wygląda bardzo nieprawdopodobnie. Z dokumentów - z tym wyjątkiem, że zamiast rysować zawartość widżetu za pomocą QPaintera itp. Używasz standardowych poleceń renderowania OpenGL. – tathagata

+2

@tathagata: niestety się mylicie, pomimo przegranych; przeczytaj moją odpowiedź na pytanie. –

+0

Dzięki Greg, za wskazanie tego! Po prostu logicznie się domyślałem. Chyba się myliłem. – tathagata

Odpowiedz

13

Spójrz na http://doc.qt.io/archives/4.6/opengl-2dpainting.html dla pouczającego przykładu, gdzie można również znaleźć następujący cytat: "możliwe jest ponowne wdrożenie jego [QGLWidget] paintEvent() i użycie QPaintera do rysowania na urządzeniu, tak jak Ty przy użyciu QWidget, jedyną różnicą jest to, że operacje malowania zostaną przyspieszone w sprzęcie, jeśli jest on obsługiwany przez sterowniki OpenGL systemu. "

Odpowiedź na pierwsze pytanie brzmi: tak.

Aby dowiedzieć się dokładnych szczegółów implementacji, rzućmy szybko okiem na kawałek kodu źródłowego z QOpenGLPaintEngine (które można znaleźć, wyszukując w Internecie):

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); 
    } 
} 

ta odpowiada na pytanie dotyczące QImages, są one rzeczywiście rysowane za pomocą tekstur.

+0

bardzo dziękuję Greg! to oczyściło moje wątpliwości. –

+3

Korzyści z opensource! –

6

Tak, jeśli używasz polecenia GL wewnątrz QGLWidget, wewnątrz metod paintGL, resizeGL i initializeGL, otrzymasz pełną sprzętową akcelerację (jeśli są dostępne).

Wydaje się również, że używanie QPaintera w QGLWidget również uzyskuje przyspieszenie HW, ponieważ istnieje implementacja OpenGL QPainEngine, możesz przeczytać o tym here.

Powiązane problemy