场景图 - 在QML下的Vulkan#
展示如何在Qt Quick场景下直接使用Vulkan进行渲染。
注意
编译此示例需要一个SDK。有关安装信息,请参阅Vulkan集成。
概述#
此示例使用了beforeRendering()
和beforeRenderPassRecording()
信号,在Qt Quick场景下绘制自定义的Vulkan内容。使用QML渲染一个文本标签在最上面。
在大多数方面,此示例与OpenGL Under QML、Direct3D 11 Under QML和Metal 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()
信号。