比较两种在Qt中将原始OpenGL渲染到QML UI的方法

7
根据this文章,将原始OpenGL渲染到由QtQuick场景图管理的应用程序中有两种主要方法。简而言之,它们是(据我理解):
  • 在手写代码中调用原始OpenGL方法,并通过QtQuick公开的一些API将其挂接到场景图的渲染循环中。
  • 将您场景中的原始OpenGL部分渲染到QQuickFramebufferObject中,该对象像场景图中的组件一样被处理,并且本身被呈现为纹理。
这两种方法的优缺点是什么?
1个回答

5
< p >使用QQuickWindow::beforeRendering()QQuickWindow::afterRendering() 信号的问题是,它们的插槽中做的所有OpenGL绘图都将被适当地放置在渲染的Qt Quick场景下方或上方。如果这已经足够好了——也就是说,您只想绘制自定义的OpenGL背景或某种叠加层——那么就可以这样做。

如果您需要更多功能,例如使用OpenGL来渲染某个放置在场景图中的QtQuick项,那么您必须选择第二个选项:将OpenGL渲染到一个作为纹理用于某些QtQuick项的framebufferobject中。正如您链接的文档所述,这给您带来了更多可能性(使用多个渲染上下文甚至多个渲染线程),但也会带来性能损失。而且,实现起来也更麻烦。

通常情况下,由于选项1)通常不足够,因此您被迫选择2)。这是我知道的在QtQuick场景中使用原始OpenGL的唯一方法。


性能成本有多重要?我的应用程序不是高度动态交互性能受限的。 - Andrey Mishchenko
呃...我不知道。这取决于你想使用OpenGL渲染的物品的数量、大小和复杂程度以及你所针对的设备。我的经验是,QML应用程序的成本通常由QML组件实例化和JS执行主导;而渲染时间可以忽略不计。但是我不使用FBO,所以我不能说它们如何改变画面。据我所听,切换FBO是“便宜”的......但这几乎不是可靠的信息。通过FBO渲染到纹理的性能影响与Qt Quick无关,因此将其作为单独的问题提出可能是值得的。 - Michał W. Urbańczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接