Sur cette page

Exemple de triangle Vulkan : Bonjour

Présente les principes de base du rendu avec l'QVulkanWindow, et l'API Vulkan.

L'exemple « Hello Vulkan Triangle » crée un pipeline graphique complet, comprenant un shader de sommets et un shader de fragments, afin de rendre un triangle.

Capture d'écran d'un exemple

Démarrage

Chaque application Qt utilisant Vulkan devra disposer d'une classe ` Vulkan instance ` qui encapsule l'état au niveau de l'application et initialise une bibliothèque Vulkan.

Un objet ` QVulkanWindow ` doit toujours être associé à un objet ` QVulkanInstance ` ; c'est pourquoi, dans l'exemple, la création de l'instance précède celle de la fenêtre. L'objet ` QVulkanInstance ` doit également survivre à la fenêtre.

    QVulkanInstance inst;
    inst.setLayers({ "VK_LAYER_KHRONOS_validation" });
    if (!inst.create())
        qFatal("Failed to create Vulkan instance: %d", inst.errorCode());

Cet exemple active les couches de validation, lorsqu'elles sont prises en charge. Si les couches demandées ne sont pas présentes, la requête sera ignorée. D'autres couches et extensions peuvent être activées de la même manière.

    VulkanWindow w;
    w.setVulkanInstance(&inst);

    w.resize(1024, 768);
    w.show();

Une fois l'instance prête, il est temps de créer une fenêtre. Notez que ` w ` réside dans la pile et est déclarée après ` inst`.

La sous-classe QVulkanWindow

Pour ajouter des fonctionnalités personnalisées à une ` QVulkanWindow`, on utilise la sous-classification. Celle-ci suit les modèles existants de ` QOpenGLWindow ` et ` QOpenGLWidget`. Cependant, ` QVulkanWindow ` utilise un objet ` QVulkanWindowRenderer ` distinct.

La sous-classe ` QVulkanWindow ` réimplémente la fonction d'usine ` QVulkanWindow::createRenderer()`. Celle-ci renvoie simplement une nouvelle instance de la sous-classe ` QVulkanWindowRenderer `. Afin de pouvoir accéder à diverses ressources Vulkan via l'objet `window`, un pointeur vers la fenêtre est transmis et stocké via le constructeur.

class VulkanWindow : public QVulkanWindow
{
public:
    QVulkanWindowRenderer *createRenderer() override;
};

Le rendu proprement dit

QVulkanWindow mettent en file d’attente leurs appels de dessin dans leur réimplémentation de ` QVulkanWindowRenderer::startNextFrame()`. Une fois cette opération terminée, elles doivent appeler ` QVulkanWindow::frameReady()`. L’exemple ne comporte pas de génération de commandes asynchrone ; l’appel à `frameReady()` est donc effectué directement depuis `startNextFrame()`. Pour obtenir des mises à jour continues, l’exemple appelle simplement ` QWindow::requestUpdate()` afin de planifier un rafraîchissement.

L’exemple illustre également l’anticrénelage par échantillonnage multiple. En fonction du nombre d’échantillons pris en charge indiqué par QVulkanWindow::supportedSampleCounts(), l’exemple choisit entre un échantillonnage multiple 8x, 4x ou aucun échantillonnage multiple. Une fois la configuration effectuée via `QVulkanWindow::setSamples()`, ` QVulkanWindow ` se charge du reste : les tampons de couleur multi-échantillonnés supplémentaires sont créés automatiquement, et la résolution dans les tampons de la chaîne d’échange est effectuée à la fin du passage de rendu par défaut pour chaque image.

Exécution de l’exemple

Vous pouvez exécuter l’exemple à partir de :

Exemple de projet sur code.qt.io

© 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.