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

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

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

【问题讨论】:

    标签: c++ qt 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 上下文?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2020-01-07
      • 2011-11-02
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多