欢迎来到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添加自定义功能,请使用子类,这遵循了QOpenGLWindowQOpenGLWidget中现有的模式。然而,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 运行示例,请打开 欢迎 模式并从 示例 中选择示例。有关更多信息,请访问 构建和运行示例

示例项目 @ code.qt.io

© 2024 Qt 公司有限公司。本文档的贡献包括各自所有者的版权。本文档根据自由软件基金会的发布受 GNU 自由文档许可证版本 1.3 的条款许可。Qt 和相应的商标是芬兰的 Qt 公司及其在世界其他国家的商标。所有其他商标都是其各自所有者的财产。