场景图 - 在QML下的Vulkan#

展示如何在Qt Quick场景下直接使用Vulkan进行渲染。

../_images/vulkanunderqml-example.jpg

注意

编译此示例需要一个SDK。有关安装信息,请参阅Vulkan集成。

概述#

此示例使用了beforeRendering()beforeRenderPassRecording()信号,在Qt Quick场景下绘制自定义的Vulkan内容。使用QML渲染一个文本标签在最上面。

在大多数方面,此示例与OpenGL Under QMLDirect3D 11 Under QMLMetal Under QML示例类似,它们都渲染相同自定义内容,只是通过不同的本地API。

本文档将介绍如何在QML中使用QML,而不会深入到自定义Vulkan渲染的细节。

从QML影响Vulkan渲染#

此示例展示了如何使用暴露给QML的值来控制Vulkan渲染。

要将阈值值t暴露给QML,我们像这样在VulkanSquircle的定义中使用Q_OBJECT、Q_PROPERTY和QML_ELEMENT宏:

然后我们声明公共和私有项

然后在main.qml中,我们使用NumberAnimation 对阈值值进行动画处理。

变量t最终被用于绘制椭圆的SPIR-V着色程序中。

使用信号渲染自定义Vulkan内容#

使用beforeRendering()beforeRenderPassRecording()信号。

beforeRendering()信号在每一帧的开始时发出,在场景图开始渲染之前。这意味着对这一信号的响应所做出的任何Vulkan绘制调用都会堆叠在Qt Quick项下面。存在两个信号,因为自定义Vulkan命令被记录在与场景图使用的相同命令缓冲区上。

仅使用beforeRendering()函数是不够的,因为它会在帧开始时发出,在用vkCmdBeginRenderPass命令记录renderpass实例开始之前。

解决方案:通过连接到beforeRenderPassRecording(),应用程序自己的命令和场景图结构将按正确的顺序执行。

信号连接是通过sync()函数完成的

另一种方法是在Qt Quick场景上渲染Vulkan内容是通过连接到afterRendering()afterRenderPassRecording()信号。

示例项目 @ code.qt.io