Szenendiagramm - Vulkan unter QML
Zeigt, wie man direkt mit Vulkan unter einer Qt Quick Szene rendert.
Hinweis: Das Kompilieren dieses Beispiels erfordert ein SDK. Siehe Vulkan-Integration für Informationen zur Installation.
Übersicht
In diesem Beispiel werden die Signale QQuickWindow::beforeRendering() und QQuickWindow::beforeRenderPassRecording() verwendet, um benutzerdefinierte Vulkan-Inhalte unter einer Qt Quick -Szene zu zeichnen. QML wird zum Rendern einer Textbeschriftung oben verwendet.
Das Beispiel ist in den meisten Punkten äquivalent zu den Beispielen OpenGL unter QML, Direct3D 11 unter QML und Metal unter QML, sie alle rendern denselben benutzerdefinierten Inhalt, nur über unterschiedliche native APIs.
Die Einzelheiten der Verwendung von QML werden in dieser Dokumentation behandelt, ohne auf die Details des benutzerdefinierten Vulkan-Renderings einzugehen.
Beeinflussung des Vulkan-Renderings durch QML
Das Beispiel zeigt, wie Werte, die QML zur Steuerung des Vulkan-Renderings zur Verfügung gestellt werden, verwendet werden können.
Um den Schwellenwert t
für QML freizugeben, verwenden wir in der Definition von VulkanSquircle
die Makros Q_OBJECT, Q_PROPERTY und QML_ELEMENT wie folgt:
class VulkanSquircle : public QQuickItem { Q_OBJECT Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged) QML_ELEMENT
Anschließend deklarieren wir öffentliche und private Elemente:
public: VulkanSquircle(); qreal t() const { return m_t; } void setT(qreal t); signals: void tChanged(); public slots: void sync(); void cleanup(); private slots: void handleWindowChanged(QQuickWindow *win); private: void releaseResources() override; qreal m_t = 0; SquircleRenderer *m_renderer = nullptr;
In main.qml
animieren wir dann den Schwellenwert mit einem NumberAnimation.
VulkanSquircle { SequentialAnimation on t { NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad } NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad } loops: Animation.Infinite
Die Variable t
wird schließlich vom SPIR-V-Shader-Programm verwendet, das die Eichhörnchen zeichnet.
Verwendung von Signalen zum Rendern benutzerdefinierter Vulkan-Inhalte
Es werden die Signale QQuickWindow::beforeRendering() und QQuickWindow::beforeRenderPassRecording() verwendet.
Das Signal QQuickWindow::beforeRendering() wird zu Beginn eines jeden Frames ausgegeben, bevor der Szenegraph mit dem Rendering beginnt. Das bedeutet, dass alle Vulkan-Zeichenaufrufe, die als Antwort auf dieses Signal erfolgen, unter den Qt Quick Elementen gestapelt werden. Es gibt zwei Signale, da die benutzerdefinierten Vulkan-Befehle in demselben Befehlspuffer aufgezeichnet werden, der auch vom Szenengraphen verwendet wird.
Die Funktion beforeRendering() allein reicht dafür nicht aus, da sie am Anfang des Frames ausgegeben wird, bevor der Start einer renderpass
-Instanz mit vkCmdBeginRenderPass aufgezeichnet wird.
Die Lösung: Durch die Verbindung mit beforeRenderPassRecording() werden die eigenen Befehle der Anwendung und das Gerüst des Szenegraphen in der richtigen Reihenfolge aufgezeichnet.
Das Verbinden der Signale wird durch die Funktion sync()
vorgenommen:
void VulkanSquircle::sync() { if (!m_renderer) { m_renderer = new SquircleRenderer; // Initializing resources is done before starting to record the // renderpass, regardless of wanting an underlay or overlay. connect(window(), &QQuickWindow::beforeRendering, m_renderer, &SquircleRenderer::frameStart, Qt::DirectConnection); // Here we want an underlay and therefore connect to // beforeRenderPassRecording. Changing to afterRenderPassRecording // would render the squircle on top (overlay). connect(window(), &QQuickWindow::beforeRenderPassRecording, m_renderer, &SquircleRenderer::mainPassRecordingStart, Qt::DirectConnection); } m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio()); m_renderer->setT(m_t);
Eine weitere Möglichkeit, Vulkan-Inhalte auf der Szene Qt Quick zu rendern, ist die Verbindung mit den Signalen QQuickWindow::afterRendering() und QQuickWindow::afterRenderPassRecording().
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.