Evgenii Legotckoi
Evgenii Legotckoi27. Januar 2017 07:53

QPainter OpenGL Core-Profil-Kontextunterstützung

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:


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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken