C++ 中具有单个 openGL 上下文的多个 QGLWidget

Posted

技术标签:

【中文标题】C++ 中具有单个 openGL 上下文的多个 QGLWidget【英文标题】:Multiple QGLWidgets with a single openGL Context in C++ 【发布时间】:2011-12-13 21:54:51 【问题描述】:

我正在编写一个由多个 (16-32) 个绘图组成的应用程序,这些绘图每秒更新几次,并使用 openGL 绘制。到目前为止,我已经用 GLUT 完成了大部分情节的原型设计。但是,我想采用像 QT 这样的完整框架,并且我正准备编写一个测试 QGLWidget。

在开始之前,我想弄清楚多个 QGLWidgets 是否可以共享一个 openGL 上下文?如果是这样,在小部件之间共享 openGL 上下文时,我需要跟踪什么细节?

【问题讨论】:

【参考方案1】:

多个 QGLWidgets 是否可以共享一个 openGL 上下文?

现在这是不可能的,因为它取决于所讨论的平台:在 X11/GLX 上确实可以在多个可绘制对象上使用间接上下文,但是上下文只能在一个可绘制对象上处于活动状态一次。

但是:

也可以(这是推荐的方法)让多个上下文共享它们的数据。在 OpenGL 的最初版本中,这只是显示列表,因此这仍然称为列表共享。但是对于当前版本的 OpenGL,这还包括纹理、像素缓冲区对象和顶点缓冲区对象。然而,帧缓冲区对象不能共享,但由于纹理可以用作 FBO 附件,这没什么大不了的。

QGLWidget 提供了一个简单的 API 来在 QGLWidgests 的上下文之间共享上下文数据。

【讨论】:

个别情节极其简单。它们是散点图的集合,不需要共享数据(PBO、VBO、FBO)。我的理解是为每个 openGL 上下文分配了大量资源,并且在上下文之间切换非常昂贵。在这种情况下,是否最好在所有小部件之间共享一个上下文? @slayton:切换上下文的开销是由于资源的变化。一种资源将永远改变:窗口。但是如果上下文的数据是共享的,事情就不会那么糟糕了。您还必须了解,上下文切换的开销对于实时渲染应用程序来说是一个更大的问题,其中图像是在动画中生成的。在你的情况下,你有相当简单的情节,可能没有要交换的纹理。 如果各个 QGLWidget 都包含在同一个窗口中,那么每次上下文切换都会更改该资源吗? openGL是否有一个与操作系统绘制的窗口不同的窗口资源?还是每个上下文都有指向同一资源的链接? @slayton:每个 QGLWidget 都维护一个独立的 OS 图形系统子窗口。对于这些窗口中的每一个,都需要一个单独的 OpenGL 上下文。但是:如果所有这些 QGLWidget 都在同一个窗口中,为什么不将其替换为单个 QGLWidget 并使用 glViewport + glScissor 仅使用一个 OpenGL 上下文绘制不同的图?【参考方案2】:

是的,可以使用 this constructor 共享 opengl 上下文。

如果是这样,我在分享时需要注意什么细节 小部件之间的 OpenGL 上下文?

我不确定,但我不认为有什么特别需要你注意的。

【讨论】:

以上是关于C++ 中具有单个 openGL 上下文的多个 QGLWidget的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:具有多个上下文的独立持久存储与具有单个上下文的独立持久存储

如何用 C++ 编写 Cocoa OpenGL 应用程序?

OpenGL ES 2.0 中具有不同纹理的许多对象

将 pyqt opengl 上下文传递给 C++ 进行渲染

如何在 OpenGL 中将多个纹理分配到单个网格中?

具有可分离程序的 OpenGL 统一块绑定