在C++中,使用单个openGL上下文实现多个QGLWidgets

3

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

在开始之前,我想弄清楚是否可以让多个QGLWidgets共享一个openGL上下文?如果可以,当在小部件之间共享openGL上下文时,是否需要注意特定的事项?

2个回答

3
如果多个QGLWidgets共享一个OpenGL上下文是可行的吗?
这个问题没有通用的答案,因为它取决于所使用的平台:在X11 / GLX上,确实可以在多个drawable上使用间接上下文,但上下文一次只能在一个drawable上活动。
然而:
还有一种方法(也是推荐的方法)可以使多个上下文共享其数据。在最初的OpenGL版本中,这仅涉及显示列表,因此仍称为列表共享。但是,在当前的OpenGL版本中,这也包括纹理、像素缓冲对象和顶点缓冲对象。帧缓冲对象无法共享,但由于纹理可以用作FBO附件,所以并不重要。
QGLWidget提供了一种简单的API来在QGLWidgets之间共享上下文数据。

个别的图表非常简单。它们是散点图的集合,不需要共享任何数据(PBOs、VBOs、FBOs)。我理解每个OpenGL上下文都会分配很多资源,并且在上下文之间切换相当昂贵。在这种情况下,是否最好拥有一个在所有小部件之间共享的单个上下文? - slayton
@slayton:切换上下文的开销是由于资源的变化而产生的。一个资源将始终发生变化:窗口。但是,如果上下文的数据是共享的,情况就不那么糟糕了。此外,您必须了解,上下文切换的开销对于实时渲染应用程序来说更是一个问题,其中图像是以动画形式生成的。在您的情况下,您有相当简单的图形和可能不需要交换纹理。 - datenwolf
如果所有的QGLWidgets都包含在同一个窗口中,那么每次上下文切换资源是否都会更改?OpenGL是否有一个与操作系统绘制的窗口不同的窗口资源?还是每个上下文都有一个指向相同资源的链接? - slayton
@slayton:每个QGLWidget都维护着操作系统图形系统的一个独立子窗口。对于每个窗口,都需要一个单独的OpenGL上下文。然而:如果所有这些QGLWidgets都在同一个窗口中,为什么不用一个单独的QGLWidget替换它,并使用glViewport + glScissor来使用一个OpenGL上下文绘制不同的图表呢? - datenwolf

1

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

如果这样做,当在小部件之间共享OpenGL上下文时,我需要注意什么特别的事项吗?

我不确定,但我认为您不需要特别注意任何事情。


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