- 1. GL-Lack-Engine
- 2. Probleme
- 3. Progress
- 4. Letztes fehlendes Stück
- 5. Wann?
Wie viele Leute wissen, hat QPainter eine Multi-Backend-Architektur und zwei Haupt-Rendering-Implementierungen unter der Haube von Qt 5: Das Raster-Rendering engine und eine OpenGL2-Engine, die auf OpenGL ES 2.0 abzielt.
GL-Lack-Engine
Während die Bitmap-Rendering-Engine eines der Juwelen von Qt ist, sprechen wir über die andere Hälfte: die GL-Rendering-Engine, die verwendet wird, wenn QPainter geöffnet wird:
- QOpenGLWindow ,
- QOpenGLWidget ,
- oder QOpenGLPaintDevice , das den aktuellen Kontext auf das gezeichnete Ziel übertragen kann und hauptsächlich verwendet wird, wenn FBOs .
Probleme
Was ist mit modernem OpenGL?
Welche Probleme sich früh zeigten: Um Qt 5.0 herum, für diejenigen, die einen Hauptprofilkontext benötigten, während sie ein benutzerdefiniertes OpenGL-Rendering erstellten, das am Ende ziemlich oft funktionierte. Komponenten wie Qt Quick konnten anfangs nicht mit solchen Kontexten arbeiten, da sie sich auf veraltete/entfernte Funktionalität (z. B. clientseitige Zeiger), fehlendes Vertex-Array-Objekt, GLSL-Version von Shadern, deren Unterstützung für solche Kontexte nicht erforderlich ist, verlassen mussten .
In einigen Fällen war die Auswahl eines Kompatibilitätsprofils eine praktikable Problemumgehung. Allerdings fehlt Mac OS X / macOS notorisch die Unterstützung dafür: Es besteht die Wahl zwischen OpenGL 2.1 oder dem Hauptprofilkontext 3.2+. Der Versuch, dieses Problem beispielsweise dadurch zu lösen, dass eine Textur in einem Kontext gerendert und die Textur dann in einem anderen Kontext durch gemeinsame Nutzung von Ressourcen verwendet wird, ist oft vergeblich, da einige Plattformen dazu neigen, die gemeinsame Nutzung von Ressourcen über verschiedene Versions-/Profilkontexte hinweg abzulehnen.
Progress
Glücklicherweise wurden diese Dinge während des Lebenszyklus von Qt 5 verbessert: Zuerst wurden Qt Quick und dann andere, weniger benutzerdefinierte GL-basierte Komponenten gepatcht, um sowohl mit Kern- als auch mit Kompatibilitätskontexten zu funktionieren.
Ab Qt 5.8 gibt es eine große Ausnahme: die GL-Rendering-Engine für QPainter.
Letztes fehlendes Stück
Die gute Nachricht ist, dass diese Beschränkung bald aufgehoben wird. Dank des Beitrags von Krita siehe hier als Referenz , kann QPainter jetzt im Hauptkontextprofil funktionieren. Funktional bringt das keine Änderungen, das Rendern erfolgt nach wie vor mit den gleichen Methoden wie bisher.
Zusätzlich zur Behebung des ursprünglichen Patches wurde dieser auch in ein Regressionstestsystem namens Lancelot integriert. Das bedeutet, dass es zusätzlich zu Bitmap (mit verschiedenen QImage-Formaten) und OpenGL 2 von nun an auch mit dem Hauptprofilkontext ausgeführt wird, um sicherzustellen, dass QPainter ohne Regression zwischen Qt-Releases beendet wird.
Im Allgemeinen bedeutet dies, dass das folgende Code-Snippet wie erwartet funktioniert.
class Window : public QOpenGLWindow { void initializeGL() override { QSurfaceFormat fmt; fmt.setVersion(4, 5); // or anything >= 3.2 fmt.setProfile(QSurfaceFormat::CoreProfile); setFormat(fmt); } void paintGL() override { QPainter p(this); p.fillRect(10, 10, 50, 50, Qt::red); ... } ... };
Wann?
Quart 5.9.
Der Patch wird nun in qtbase im „dev“-Zweig gemergt. Wird in Kürze zu Qt 5.9 hinzugefügt.
Источник Qt-Blog