Hello Vulkan 三角形示例
展示使用QVulkanWindow 和 Vulkan API 进行渲染的基础知识。
Hello Vulkan 三角形示例创建了一个完整的图形管道,包括顶点和片段着色器,用于渲染三角形。
启动
每个使用 Vulkan 的 Qt 应用程序都必须有一个Vulkan instance
,用于封装应用程序级状态并初始化 Vulkan 库。
QVulkanWindow 必须始终与QVulkanInstance 关联,因此示例在窗口之前执行实例创建。QVulkanInstance 对象的寿命也必须长于窗口。
QVulkanInstanceinst; inst.setLayers({"VK_LAYER_KHRONOS_validation"});if(!inst.create()) qFatal("Failed to create Vulkan instance: %d", inst.errorCode());
该示例在支持的情况下启用验证层。当请求的层不存在时,请求将被忽略。其他层和扩展也可以类似方式启用。
VulkanWindow w; w.setVulkanInstance(&inst); w.resize(1024, 768); w.show();
实例准备就绪后,就可以创建窗口了。请注意,w
位于堆栈中,在inst
之后声明。
QVulkanWindow 子类
要为QVulkanWindow 添加自定义功能,需要使用子类库。这沿用了QOpenGLWindow 和QOpenGLWidget 的现有模式。不过,QVulkanWindow 使用了一个单独的QVulkanWindowRenderer 对象。
QVulkanWindow 子类重新实现了工厂函数QVulkanWindow::createRenderer() 。这只是返回QVulkanWindowRenderer 子类的一个新实例。为了能够通过窗口对象访问各种 Vulkan 资源,窗口的指针会通过构造函数传递和存储。
class VulkanWindow : public QVulkanWindow { public: QVulkanWindowRenderer *createRenderer() override; };
实际渲染
QVulkanWindow 子类在重新实现 () 时对绘制调用进行排队。一旦完成,它们必须回调 ()。该示例没有异步命令生成,因此 frameReady() 调用是直接从 startNextFrame() 调用的。要获得连续更新,示例只需调用 () 以安排重绘。QVulkanWindowRenderer::startNextFrame QVulkanWindow::frameReady QWindow::requestUpdate
该示例还演示了多采样抗锯齿。根据QVulkanWindow::supportedSampleCounts() 报告的支持样本数,示例在 8 倍、4 倍或无多重采样之间进行了选择。一旦通过 QVulkanWindow::setSamples() 进行了配置,QVulkanWindow 就会处理剩下的工作:自动创建额外的多采样颜色缓冲区,并在每帧默认渲染过程结束时解析到交换链缓冲区。
运行示例
运行示例 Qt Creator,打开Welcome 模式,然后从Examples 中选择示例。更多信息,请参阅Qt Creator: 教程:构建并运行。
© 2025 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.