En esta página

Ejemplo de triángulo Hello Vulkan

Muestra los fundamentos del renderizado con QVulkanWindow y la API Vulkan.

El ejemplo del triángulo Hello Vul kan crea un canal gráfico completo, que incluye un sombreador de vértices y fragmentos, para renderizar un triángulo.

Captura de pantalla de ejemplo

Inicio

Cada aplicación Qt que use Vulkan tendrá que tener un Vulkan instance que encapsule el estado a nivel de aplicación e inicialice una librería Vulkan.

Un QVulkanWindow debe estar siempre asociado a un QVulkanInstance y por ello el ejemplo realiza la creación de la instancia antes que la ventana. El objeto QVulkanInstance también debe sobrevivir a la ventana.

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

El ejemplo habilita las capas de validación, cuando son compatibles. Cuando las capas solicitadas no estén presentes, la solicitud será ignorada. Capas adicionales y extensiones pueden ser habilitadas de manera similar.

    VulkanWindow w;
    w.setVulkanInstance(&inst);

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

Una vez que la instancia está lista, es hora de crear una ventana. Tenga en cuenta que w vive en la pila y se declara después de inst.

La Subclase QVulkanWindow

Para añadir funcionalidad personalizada a QVulkanWindow, se utiliza la subclase. Esto sigue los patrones existentes de QOpenGLWindow y QOpenGLWidget. Sin embargo, QVulkanWindow utiliza un objeto QVulkanWindowRenderer separado.

La subclase QVulkanWindow reimplementa la función de fábrica QVulkanWindow::createRenderer(). Ésta simplemente devuelve una nueva instancia de la subclase QVulkanWindowRenderer. Para poder acceder a varios recursos Vulkan a través del objeto ventana, se pasa y almacena un puntero a la ventana a través del constructor.

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

Las subclases

QVulkanWindow ponen en cola sus llamadas a dibujar en su reimplementación de QVulkanWindowRenderer::startNextFrame(). Una vez hecho esto, deben volver a llamar a QVulkanWindow::frameReady(). El ejemplo no tiene generación asíncrona de comandos, por lo que la llamada a frameReady() se hace directamente desde startNextFrame(). Para obtener actualizaciones continuas, el ejemplo simplemente invoca a QWindow::requestUpdate() para programar un repintado.

El ejemplo también demuestra el antialiasing multimuestra. Basado en el número de muestras soportadas reportadas por QVulkanWindow::supportedSampleCounts() el ejemplo elige entre 8x, 4x, o sin multimuestreo. Una vez configurado mediante QVulkanWindow::setSamples(), QVulkanWindow se encarga del resto: los buffers de color multimuestra adicionales se crean automáticamente, y la resolución en los buffers swapchain se realiza al final de la pasada de render por defecto para cada fotograma.

Ejecución del ejemplo

Para ejecutar el ejemplo desde Qt Creatorabra el modo Welcome y seleccione el ejemplo de Examples. Para más información, ver Qt Creator: Tutorial: Construir y ejecutar.

Proyecto de ejemplo @ 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.