Gráfico de escena - Vulkan bajo QML
Muestra cómo renderizar directamente con Vulkan bajo una escena Qt Quick.

Nota: La compilación de este ejemplo requiere un SDK. Consulte Integración de Vulkan para obtener información sobre qué instalar.
Visión general
Este ejemplo hace uso de las señales QQuickWindow::beforeRendering() y QQuickWindow::beforeRenderPassRecording() para dibujar contenido Vulkan personalizado bajo una escena Qt Quick. QML se utiliza para renderizar una etiqueta de texto en la parte superior.
El ejemplo es equivalente en la mayoría de los aspectos a los ejemplos OpenGL bajo QML, Direct3D 11 bajo QML y Metal bajo QML, todos ellos renderizan el mismo contenido personalizado, sólo que a través de diferentes API nativas.
Las particularidades de la utilización de QML se cubrirán en esta documentación sin profundizar en los detalles de la renderización Vulkan personalizada.
Afectando al renderizado Vulkan desde QML
El ejemplo muestra cómo utilizar valores expuestos a QML para controlar el renderizado Vulkan.
Para exponer el valor de umbral t a QML, en la definición de VulkanSquircle, usamos las macros Q_OBJECT, Q_PROPERTY, y QML_ELEMENT de esta forma:
class VulkanSquircle : public QQuickItem { Q_OBJECT Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged) QML_ELEMENT
A continuación declaramos los elementos públicos y privados:
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;
A continuación, en main.qml animamos el valor umbral utilizando una 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
La variable t es utilizada en última instancia por el programa shader SPIR-V que dibuja las ardillas.
Uso de señales para renderizar contenido Vulkan personalizado
Las señales QQuickWindow::beforeRendering() y QQuickWindow::beforeRenderPassRecording() son las que se utilizan.
La señal QQuickWindow::beforeRendering() se emite al comienzo de cada fotograma, antes de que el gráfico de escena comience su renderizado. Esto significa que cualquier llamada a dibujo Vulkan que se haga como respuesta a esta señal, se apilará bajo los elementos Qt Quick. Hay dos señales porque los comandos Vulkan personalizados se graban en el mismo buffer de comandos utilizado por el gráfico de escena.
La función beforeRendering() por sí sola no es suficiente para esto, porque se emite al inicio del frame, antes de grabar el inicio de una instancia de renderpass usando vkCmdBeginRenderPass.
La solución: conectando con beforeRenderPassRecording(), los comandos propios de la aplicación y el andamiaje del gráfico de escena terminarán en el orden correcto.
La conexión de las señales se realiza mediante la función 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);
Otra forma de renderizar contenido Vulkan sobre la escena Qt Quick es conectándose a las señales QQuickWindow::afterRendering() y 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.