Evgenii Legotckoi
Evgenii Legotckoi28. Januar 2016 07:24

Qt und Direct3D 12 - Erste Begegnung

Übersetzung der offiziellen Nachrichten von Laszlo Agocs

Das Gesicht von Grafik-APIs verändert sich. Qt Quick 2 wurde 2012 mit Qt 5.0 veröffentlicht und basiert auf OpenGL und OpenGL ES 2.0. Seitdem wurden Änderungen und Verbesserungen vorgenommen - der Qt Quick 2D-Renderer wurde eingeführt, mit Software-Rasterung wurde experimentiert und ein Bereitstellungssystem für die neuesten Versionen von OpenGL wurde dem gesamten Qt-Grafikstapel hinzugefügt. Wie Lars jedoch in seinem Vortrag auf dem Qt World Summit 2015 feststellte, ändern sich die Dinge: Neue, effizientere Low-Level-APIs wie Vulkan, Metal und Direct3D 12 stehen kurz vor der breiten Verfügbarkeit. Einige von ihnen sind plattformspezifisch, was sie zur besten Wahl für die Ausrichtung auf bestimmte Plattformen macht, während von anderen erwartet wird, dass sie eine Vielzahl von Plattformen unterstützen. Gleichzeitig ist die Grafik-API-Beschleunigung bei komplexen Vorhersagen nicht immer die beste Wahl: Traditionell lässt sich die Desktop-Benutzeroberfläche auf älterer Hardware manchmal besser mit älterem CPU-basiertem Rendering ausführen.

Daher ist es nicht überraschend, dass einer der Forschungsbereiche in zukünftigen Versionen von Qt darin besteht, den Grafikstapel und insbesondere Qt Quick flexibler zu machen, mit Unterstützung für verschiedene Grafik-APIs sowie Unterstützung für Software-Rendering.

Solche Forschungsarbeit führt oft zu positiven Effekten, und dieser Eintrag ist so einer. Ein einfaches Qt-Modul, das die Direct3D 12-Integration in einem separaten Qt-Fenster – oder alternativ eine QWidget-basierte Anwendung – enthält und es einfach macht, mit modernen D3D-Techniken zu experimentieren, während Sie weiterhin die vertrauten Qt-APIs, -Tools und -Entwicklungsumgebungen und das Ökosystem genießen es bietet.


Was es ist

Das QtD3D12Window-Modul, das sich im qt-labs-Repository befindet, ist ein Qt 5.6-Modul, das eine QD3D12Window-Klasse ähnlich QOpenGLWindow bereitstellt, von einer qmake-Regel behandelt wird, um einen HLSL-Shader über fxc zu kompilieren, und über einen umfassenden Satz von Beispielen für die grundlegende Verwendung verfügt (wie die Hello World-Beispiele von Microsoft).

Was es nicht ist

Bevor wir fortfahren, lassen Sie uns verstehen, was dieses Modul nicht ist: Es ist keine Möglichkeit, vorhandene Qt-Anwendungen auf Direct3D auszuführen (was genau [ANGLE] bietet (https://chromium.googlesource.com/angle/angle/ +/master/README.md), wenn es um D3D9 und 11 geht) und unterstützt Qt Quick ohnehin nicht. Es ist auch kein Add-On zu Qt in seiner aktuellen Form, noch ist es eine vollständige Engine und ein Framework in irgendeiner Form (die QD3D12Window-Schnittstelle bietet offensichtlich unzureichende Funktionalität für komplexe und Multithread-Lösungen).

Fenster

Der erste Schritt zur Integration mit benutzerdefiniertem Rendercode ist eine neue Grafik-API, die ein Renderziel in einem nativen Fenster basierend auf QWindow erstellt. Derzeit ist OpenGL die einzige Wahl und sowohl intern (QPA-Schnittstellen, Plattform-Plugins) als auch extern (öffentliche APIs, siehe QOpenGL-Klassen in QtGui) tief in Qt integriert. Dies wird sich voraussichtlich in Zukunft ändern, aber im Moment werden wir für unser eigenständiges D3D-Experiment alles selbst machen. Das Fensterplattform-Plugin von Qt macht es einfach, ein natives Fenster-Handle zu erhalten, so als ob wir QWindow::winId() verwenden würden, das die ID des Windows-Fensters in einer Qt-Anwendung zurückgibt. Wir können dann DXGI verwenden, um die verfügbaren Adapter aufzulisten, und wir können entweder einen Hardware- oder einen WARP-Adapter auswählen und eine Swap-Kette erstellen. QD3D12Window wird all dies bewältigen und gut genug für grundlegende typische Anwendungen.

Apropos DXGI, dies ist der erste derartige Ausflug in die Verwaltung von Grafikadaptern und Geräten: Während OpenGL und seine Fensterschnittstellen normalerweise begrenzt sind, bieten andere APIs (insbesondere plattformspezifische und modellspezifische Treiber) möglicherweise mehr Optionen für die Suche nach Adaptern und Änderungen an Einstellungen, Löschen und Zurücksetzen während des Lebenszyklus der Anwendung. Solche Funktionen auf Plattformen, auf denen APIs verfügbar sind, werden in Zukunft in Qt mehr Aufmerksamkeit erhalten.

Bei der Implementierung von QD3D12Window stellte sich heraus, dass es nicht notwendig ist, eine gemeinsame Klasse zu erstellen - dank der Tatsache, dass QOpenGLWindow und QRasterWindow in Qt 5.4 eingeführt wurden: Die gemeinsame Basisklasse QPaintDeviceWindow, die im Fall von D3D natürlich irreführend ist, da unsere Fenster wird nicht zum Rendern auf der Grundlage von QPainter verwendet) bietet die gesamte notwendige Infrastruktur, damit sich eine Unterklasse auf die Besonderheiten der Grafik-API konzentrieren kann, wenn Kernfunktionen wie die Methode update() entwickelt werden. Die gute Nachricht ist, dass diese Problemumgehung es einfach macht, in Zukunft mit anderen APIs zu experimentieren (QMetalWindow, QVulkanWindow usw.).

Klasse

QD3D12Window ist ein Spiegel von QOpenGLWindow, das wiederum auf QOpenGLWidget/QGLWidget und den Methoden initializeGL - resizeGL - paintGL basiert, wobei GL jeweils in D3D umbenannt wurde. Es gibt zwei neue Unterklassenfunktionen, die implementiert werden können: releaseD3D und afterPresent. Letzteres wird jedes Mal aufgerufen, wenn ein Present-Aufruf ausgegeben wird: Die meisten einfachen Anwendungen warten in dieser Funktion auf die GPU. Die erste wird verwendet, damit die Anwendung das Entfernen des Geräts überleben kann: Wenn das Grafikgerät nicht mehr verfügbar ist, wird diese Funktion aufgerufen und ausgeführt, wenn Ressourcen während der Initialisierung / des Neuzeichnens / der Größenänderung freigegeben werden. QD3D12Window führt dann initializeD3D erneut aus. In diesem Fall kann die Anwendung funktionsfähig bleiben, während der Treiber aktualisiert wird oder auf die Ausführung von Shadern gewartet wird.

Besser natürlich am Beispiel zeigen. Werfen wir einen Blick auf das hellotriangle, das zeigt, dass Sie die Verwendung von QD3D12Window nicht überraschen wird, wenn Sie zuvor QOpenGLWindow oder QOpenGLWidget verwendet haben.

Widgets

Jetzt haben wir also in unserem Fenster nichts als den Inhalt des gerenderten D3D12. Das ist großartig, aber was machen die traditionellen Steuerungen dort? Dies kann mit QD3D12Window erreicht werden, indem ein untergeordnetes Fenster über QWidget::createWindowContainer() erstellt wird. Dies liegt an den üblichen Einschränkungen, über die Sie sich zunächst in der Dokumentation informieren sollten. Dies wird jedoch für die einfachsten Zwecke gut funktionieren.

Shader

Die Verarbeitung und Kompilierung von Shader-Code ist ein weiteres interessantes Thema. Bei OpenGL in Qt und Qt Quick liegt der Schwerpunkt auf der Kompilierung zur Laufzeit, da dies die einzige allgemein verfügbare Lösung ist, die unabhängig von Anbietern und Plattformspezifika ist. Bei anderen Grafik-APIs in der Zukunft wird erwartet, dass sich Qt mehr auf die Offline-Kompilierung und die Integration in das Build-System so weit wie möglich konzentriert. Neben den offensichtlichen Leistungsvorteilen verbessert dies den Entwicklungsworkflow erheblich: Wenn der Compiler beim Ausführen über Strg+B Informationen über Build-Time-Fehler erhält, können Sie in Qt Creator leicht spüren, wie der neue Weg den "alten" Debugging-Pfad übertrifft während die Anwendung läuft.

Das QtD3D12Window-Modul enthält eine einfache qmake-Regel, die es ermöglicht, fxc.exe zur Build-Zeit aufzurufen. Alle Beispiele verwenden es, um Header-Dateien zu erstellen, in denen der Bytecode kompiliert wird, der ein Array von Zeichen ist. Werfen Sie einen Blick auf die .pro-Datei von einem von ihnen und die Shader-Einstellung.

Das ist nicht ganz neu für Qt: Das ANGLE-Paket in qtbase führt die Shader-Kompilierung auf die gleiche Weise durch. Was verborgen ist, kann jedoch nicht in D3D-Anwendungsschichtcode wie hlsl.prf hier verwendet werden , kann es in den Ordner mkspecs/features im Qt SDK kopiert werden, wodurch es für jede Qt-Anwendung verfügbar wird.

Grafik-Debugging

QD3D12Window schaltet automatisch die D3D12-Debug-Ebene ein. Dies ist unglaublich nützlich in Bezug auf viele der häufigsten Fehler, die beim Starten von D3D12 gemacht werden, insbesondere wenn nützliche Debug-Meldungen angezeigt werden. Sie können sie jedoch deaktivieren, wenn es um Leistungstests geht.

Ein weiteres nützliches Tool ist der in Visual Studio enthaltene Grafikdebugger. Eine Möglichkeit, eine Qt-Anwendung zu starten, besteht darin, devenv /debugexe qtapplication.exe an der Eingabeaufforderung des Entwicklers auszuführen und Alt+F5 zu drücken. (Alternativ könnte das Erstellen von Visual Studio-Projektdateien mit qmake -tp vc auch gut funktionieren). Es hat sich bei der Entwicklung einfacher Beispiele als sehr nützlich erwiesen - zum Beispiel seine Fähigkeit, Grafikressourcen zu betrachten und auch zu sehen, ob die MIPMAP-Ebenen gut geformt sind.

Beispiele

Wie bereits erwähnt, enthält das Modul eine Reihe von Beispielen, die die Grundlagen abdecken und für den Einstieg in die D3D12-Entwicklung hilfreich sein können. Einzelheiten finden Sie in der Datei readme .

Источник 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
ИМ
Игорь Максимов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> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
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