使用 Vulkan 渲染 Qml

Posted

技术标签:

【中文标题】使用 Vulkan 渲染 Qml【英文标题】:Render Qml using Vulkan 【发布时间】:2017-01-13 15:39:31 【问题描述】:

我有一个使用 Open GL 进行绘图的 Qt 应用程序。在某些时候,我使用与 QQuickRenderControl 关联的 QQuickWindow 将 QML 场景绘制到纹理中,以便稍后将其组合到最终图像中。

现在,我正在考虑将 OpenGL 移植到 Vulkan,但我不确定是否可以对这个 QML 层做同样的事情。

阅读Qt docs我发现

QQuickWindow 使用场景图在 OpenGL 之上进行渲染。

您认为可以将其移植到 Vulkan 吗?也许覆盖QQuickWindowQQuickRenderControl?我不是 Qt 专家,所以也许有人可以让我更好地了解这个问题。

【问题讨论】:

从 Qt 5.7 开始,Quick 与 GL 紧密耦合。随着 Qt 5.8 的发布,这种情况很快就会改变(参见 this blog post。支持 Vulkan 可能会在不久的将来出现,但这不仅仅是覆盖两个类的问题...... @BaCaRoZzo,您知道将场景图移植到 Vulkan 的进展吗?另外,资源共享会起作用吗(比如非常方便的 OpenGL 实现的纹理共享)? 不幸的是,这是一个我不知道的细节,抱歉。 AFAIU 的第一步是将 CX12 后端从 TP 中移除,可能在 5.9 中,因为这可以极大地改善 Windows 系统上的体验。至于金属和 Vulkan,没有(公共)路线图,至少我不知道。然而,我发现了一个旧的讨论,其中明确指出它“不会匆忙”(参见here)。所以我可能对第一条评论过于乐观。我的错。 对于 OP,请查看 this blogpost。在这里,他们将 DX12 与当前的 OpenGL 后端集成在一起。这与您想要的方法不同,但它应该有效。 由于答案已经很老了..这有什么更新吗?金属支架呢?我的理解是,如果我编写一个自定义 QQuickItem,它将使用 OpenGL、WebGL 进行渲染,仅此而已?请注意跨平台恕我直言... 【参考方案1】:

截至 2019 年 6 月和 Qt 5.13,Qt Quick 2 支持以下后端:

    OpenGL 2.0 OpenGL ES 2.0 Direct3D 12(支持仍处于试验阶段) OpenVG 软件渲染

但是,只有 OpenGL 和 OpenGL ES 是完全可用的。例如,某些效果(如粒子)不适用于其他后端。

有关如何选择后端以及每个后端的限制是什么的更多信息,我建议阅读文档:https://doc.qt.io/qt-5/qtquick-visualcanvas-adaptations.html

特别是关于 Vulkan,Qt 从Qt 5.10 开始就增加了对它的支持。 但是,支持仍然非常有限,不包括 Qt Quick。

未来会发生变化;引用 Qt 开发邮件列表中的email:

Qt Quick for Vulkan、Metal 和 D3D11 的早期预览版可能已经出现在 Qt 5.14 中,然后在 5.15 及更高版本中发展,最终目标是 6.0。

因此,当 Qt 6 发布时,应该可以使用 Vulkan 渲染 Qt Quick。 Qt 6 的计划发布日期目前是 2020 年 11 月。与此同时,技术预览可能会从 Qt 5.14 开始提供。

我不会对 Qt 6 之前的任何事情过于乐观,因为 (1) 它只是技术预览和 (2) 据我所知,当前的官方 Qt 二进制文件根本没有与 Vulkan 链接,您需要构建如果您想使用 Vulkan,请从源代码获取 Qt。

【讨论】:

以上是关于使用 Vulkan 渲染 Qml的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vulkan * API 并行渲染对象

Vulkan多线程渲染

Vulkan Tutorial 09 图像与视图

Android 在 Vulkan 中失去焦点处理

Vulkan Tutorial 13 Render passes

Vulkan Tutorial 10 图形管线