QOpenGLWidget与共享OpenGL上下文?

时间:2015-11-10 16:37:20

标签: c++ multithreading qt opengl qt5.5

我有一个现有的OpenGL上下文,我想与新的QOpenGLWidget共享。

我知道我可以这样做:

  1. 创建QOpenGLWidget
  2. 等到调用initializeGL并保存上下文
  3. 创建新的QOpenGLContext,并将其与保存的上下文共享
  4. 但是,我想按照其他顺序进行:

    1. 创建QOpenGLContext
    2. 创建QOpenGLWidget,提供现有上下文并使其共享
    3. 这可能吗?

1 个答案:

答案 0 :(得分:2)

编辑,我对QOpenGLFramebufferObject了解不多,所以忽略我以前的答案内容。

在QOpenGLWidget中,它总是将其上下文设置为与其最近的顶级窗口(或者如果它是一个窗口本身)共享。您的理解是正确的,没有办法更改QOpenGLWidget成员上下文而不将其子类化以完全改变它的工作方式。在QOpenGLWidgetPrivate :: initialize()函数中,上下文是从defaultFormat和顶级shareContext初始化的。如果要在创建QOpenGLWidget之前使用上下文,则必须通过全局共享上下文。 Qt :: AA_ShareOpenGLContexts需要在创建QGuiApplication对象之前设置。

在尝试访问全局上下文之前,您需要等到QGuiApplication初始化全局上下文。由于global_share_context是QOpenGLContext类的静态成员,因此您只需创建任何QOpenGLContext并通过context.globalShareContext()访问它。然后只需删除您的初始QOpenGLContext。您创建的任何QOpenGLWidget都将自动与该上下文共享。如果您可以在创建()特殊上下文之前找到一种获取指向全局共享上下文的指针的方法,那么您可以只与全局上下文共享,并且您可以随意进行共享。共享是通过彼此共享的整个共享上下文组,因此任何与一个上下文的共享与整个组共享。

此外,除了QOpenGLContext says it can共享帧缓冲区对象外,我不知道这是否会发生任何变化。