Sur cette page

Exemple de triangle Hello Vulkan

Montre les bases du rendu avec QVulkanWindow et l'API Vulkan.

L'exemple Hello Vulkan Triangle crée un pipeline graphique complet, y compris un vertex et un fragment shader, pour effectuer le rendu d'un triangle.

Capture d'écran de l'exemple

Démarrage

Chaque application Qt XML utilisant Vulkan devra avoir un Vulkan instance qui encapsule l'état au niveau de l'application et initialise une bibliothèque Vulkan.

Un QVulkanWindow doit toujours être associé à un QVulkanInstance et c'est pourquoi l'exemple effectue la création de l'instance avant 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());

L'exemple active les couches de validation, lorsqu'elles sont prises en charge. Si les couches demandées ne sont pas présentes, la demande est 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 que l'instance est prête, il est temps de créer une fenêtre. Notez que w vit sur la pile et est déclaré après inst.

La sous-classe QVulkanWindow

Pour ajouter des fonctionnalités personnalisées à une fenêtre QVulkanWindow, on utilise une sous-classe. Cela suit les modèles existants de QOpenGLWindow et QOpenGLWidget. Cependant, QVulkanWindow utilise un objet QVulkanWindowRenderer séparé.

La sous-classe QVulkanWindow réimplante 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 sur 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 effectuée, elles doivent rappeler QVulkanWindow::frameReady(). L'exemple n'a pas de génération de commandes asynchrones, l'appel à frameReady() est donc fait directement à partir de startNextFrame(). Pour obtenir des mises à jour continues, l'exemple invoque simplement QWindow::requestUpdate() afin de programmer un repeint.

L'exemple démontre également l'anti-crénelage multi-échantillon. En se basant sur les nombres d'échantillons pris en charge signalés par QVulkanWindow::supportedSampleCounts(), l'exemple choisit entre un multi-échantillonnage 8x, 4x ou aucun. Une fois configuré via QVulkanWindow::setSamples(), QVulkanWindow s'occupe du reste : les tampons de couleur multi-échantillons supplémentaires sont créés automatiquement, et la résolution dans les tampons de la chaîne d'échange est effectuée à la fin de la passe de rendu par défaut pour chaque image.

Exécution de l'exemple

Pour exécuter l'exemple à partir de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.

Exemple de projet @ 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.