在Qt中将原始OpenGL渲染为QML用户界面的两种方法的比较

在Qt中将原始OpenGL渲染为QML用户界面的两种方法的比较,qt,opengl,qml,qt-quick,Qt,Opengl,Qml,Qt Quick,根据这篇文章,有两种主要方法可以将原始OpenGL渲染到应用程序中,该应用程序的UI由QtQuick的场景图管理。简言之,它们是(据我了解): 在手工编写的代码中调用原始OpenGL方法,该代码通过QtQuick公开的一些API连接到场景图的渲染循环中 将场景的原始OpenGL部分渲染为QQuickFramebufferObject,该对象被视为场景图中的一个组件,其本身被渲染为纹理 这两种方法的优缺点是什么?QQuickWindow::beforeRendering()或QQuickWin

根据这篇文章,有两种主要方法可以将原始OpenGL渲染到应用程序中,该应用程序的UI由QtQuick的场景图管理。简言之,它们是(据我了解):

  • 在手工编写的代码中调用原始OpenGL方法,该代码通过QtQuick公开的一些API连接到场景图的渲染循环中
  • 将场景的原始OpenGL部分渲染为QQuickFramebufferObject,该对象被视为场景图中的一个组件,其本身被渲染为纹理

这两种方法的优缺点是什么?

QQuickWindow::beforeRendering()或
QQuickWindow::afterRendering()
的问题是,所有从其插槽中绘制的OpenGL图形都将适当地位于渲染的Qt Quick场景下方或上方。如果这对你来说已经足够好了——例如,你只想画一个自定义的OpenGL背景或某种叠加——那么就去做吧

如果需要更多,即使用OpenGL渲染放置在场景图中的某些QtQuick项目,则必须使用第二个选项:将OpenGL渲染为用作某些QtQuick项目上纹理的framebufferobject。 正如您链接到states的文档文章所示,它为您提供了更多的可能性(使用多个渲染上下文甚至多个渲染线程),但也带来了性能成本。实施起来也比较麻烦


一般来说,由于选项1)通常不充分,您不得不选择2)。据我所知,这是在QtQuick场景中使用原始OpenGL的唯一方法

性能成本有多大?我的应用程序没有高度动态交互性能限制。嗯……我不知道。它取决于要使用OpenGL渲染的项目的数量、大小和复杂性以及目标设备。我的经验是,QML应用程序的成本通常由QML组件实例化和JS执行决定;渲染时间可以忽略不计。但是不要使用FBO,所以我不能说他们是如何改变画面的。据我所知,转换FBO是“便宜的”…但这几乎不是一个可靠的信息。通过FBO渲染到纹理上的性能影响独立于Qt Quick,因此值得单独提问。