根据本文,有两种主要方法可以将原始OpenGL渲染到应用程序中,否则其UI由QtQuick的场景图管理。 简而言之,它们是(根据我的理解):
- 在手写代码中调用原始 OpenGL 方法,这些代码通过 QtQuick 公开的一些 API 挂钩到场景图的渲染循环中。
- 将场景的原始 OpenGL 部分渲染到 QQuickFramebufferObject,该对象被视为场景图中的组件,并且自身呈现为纹理。
这两种方法的优点/缺点是什么?
QQuickWindow::beforeRendering()
或QQuickWindow::afterRendering()
信号的问题在于,从其插槽完成的所有OpenGL绘图都将适当地位于渲染的Qt Quick场景下方或上方。如果这对你来说足够好——即。你只想画一个自定义的OpenGL背景或某种叠加层——然后去做吧。
如果你需要更多,即使用OpenGL渲染一些放置在场景图中的QtQuick Item,那么你必须选择第二个选项:将OpenGL渲染到一个帧缓冲区对象,该对象用作某些QtQuick Item的纹理。作为您链接到状态的文档文章,它为您提供了更多的可能性(使用多个渲染上下文甚至多个渲染线程),但也带来了性能成本。实施起来也比较麻烦。
通常,由于选项 1) 通常是不够的,因此您被迫使用 2)。这是我所知道的在QtQuick场景中使用原始OpenGL的唯一方法。