Arborescence de scène - Vulkan sous QML
Ce document explique comment effectuer un rendu directement avec Vulkan dans une scène Qt Quick.

Remarque : la compilation de cet exemple nécessite un SDK. Consultez la section Intégration de Vulkan pour savoir quels logiciels installer.
Présentation
Cet exemple utilise les signaux ` QQuickWindow::beforeRendering()` et ` QQuickWindow::beforeRenderPassRecording()` pour dessiner du contenu Vulkan personnalisé dans une scène Qt Quick. QML est utilisé pour afficher une étiquette de texte par-dessus.
Cet exemple est, à bien des égards, équivalent aux exemples « OpenGL sous QML », « Direct3D 11 sous QML » et « Metal sous QML » : tous affichent le même contenu personnalisé, mais via des API natives différentes.
Les spécificités de l’utilisation de QML seront abordées dans cette documentation sans entrer dans les détails du rendu Vulkan personnalisé.
Influencer le rendu Vulkan depuis QML
Cet exemple montre comment utiliser des valeurs exposées à QML pour contrôler le rendu Vulkan.
Pour exposer la valeur de seuil t à QML, dans la définition de VulkanSquircle, nous utilisons les macros Q_OBJECT, Q_PROPERTY et QML_ELEMENT comme suit :
class VulkanSquircle : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged)
QML_ELEMENTNous déclarons ensuite des éléments publics et privés :
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;Ensuite, dans ` main.qml `, nous animons la valeur seuil à l’aide d’un ` 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.InfiniteLa variable t est finalement utilisée par le programme de shader SPIR-V qui dessine les « squircles ».
Utilisation de signaux pour le rendu de contenu Vulkan personnalisé
Les signaux QQuickWindow::beforeRendering() et QQuickWindow::beforeRenderPassRecording() sont ceux qui sont utilisés.
Le signal QQuickWindow::beforeRendering() est émis au début de chaque image, avant que le graphe de scène ne commence son rendu. Cela signifie que tous les appels de dessin Vulkan effectués en réponse à ce signal s’empileront sous les éléments Qt Quick. Il existe deux signaux car les commandes Vulkan personnalisées sont enregistrées dans le même tampon de commandes que celui utilisé par le graphe de scène.
La fonction beforeRendering() n’est pas suffisante à elle seule, car elle est émise au début de l’image, avant l’enregistrement du début d’une instance de ` renderpass ` à l’aide de ` vkCmdBeginRenderPass`.
La solution : en se connectant à beforeRenderPassRecording(), les commandes propres à l’application et la structure du graphe de scène se retrouveront dans le bon ordre.
La connexion des signaux s’effectue via la fonction ` sync() ` :
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);Une autre façon de rendre du contenu Vulkan par-dessus la scène d’ Qt Quick consiste à se connecter aux signaux QQuickWindow::afterRendering() et QQuickWindow::afterRenderPassRecording().
© 2026 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.