欢迎来到Vulkan三角形示例
展示使用QVulkanWindow和Vulkan API进行渲染的基础知识。
欢迎来到Vulkan三角形示例创建一个完整的图形管道,包括顶点和碎片着色器,以渲染一个三角形。
启动
每个使用Vulkan的Qt应用程序都必须有一个Vulkan实例
,它封装应用程序级别的状态并初始化Vulkan库。
一个QVulkanWindow必须始终与一个QVulkanInstance相关联,因此示例在窗口之前执行实例创建。该QVulkanInstance对象也必须比窗口存在 longer。
QVulkanInstance inst; 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::createRenderer()重实现以添加自定义功能到QVulkanWindow。这仅返回一个QVulkanWindowRenderer子类的新的实例。为了能够通過窗口对象訪問不同的Vulkan資源,將窗口指針通過建構函數傳遞和存储。
class VulkanWindow : public QVulkanWindow { public: QVulkanWindowRenderer *createRenderer() override; };
实际渲染
在QVulkanWindowRenderer::startNextFrame()的行事例中,QVulkanWindow子类对其draw调用进行排队。一旦完成,它们必须回调QVulkanWindow::frameReady()。该示例没有异步命令生成,因此frameReady()调用直接从startNextFrame()处执行。为了获得连续更新,示例通过执行QWindow::requestUpdate()来安排重绘。
示例还演示了多采样抗锯齿。根据QVulkanWindow::supportedSampleCounts()报告的支持的样本计数,示例将在8x、4x或无多采样之间进行选择。通过QVulkanWindow::setSamples()配置后,QVulkanWindow负责其余部分:自动创建额外的多采样颜色缓冲区,并在默认绘制通道的结束时执行到交换链缓冲区的解析。
运行示例
要从 Qt Creator 运行示例,请打开 欢迎 模式并从 示例 中选择示例。有关更多信息,请访问 构建和运行示例。
© 2024 Qt 公司有限公司。本文档的贡献包括各自所有者的版权。本文档根据自由软件基金会的发布受 GNU 自由文档许可证版本 1.3 的条款许可。Qt 和相应的商标是芬兰的 Qt 公司及其在世界其他国家的商标。所有其他商标都是其各自所有者的财产。