具有共享 OpenGL 上下文的 QOpenGLWidget?

QOpenGLWidget with shared OpenGL context?

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

我知道我能做到:

  1. 创建 QOpenGLWidget
  2. 等到调用 initializeGL 并保存上下文
  3. 创建新的 QOpenGLContext,并与保存的上下文共享

但是,我想按其他顺序进行:

  1. 创建 QOpenGLContext
  2. 创建 QOpenGLWidget,提供现有上下文并共享它们

这可能吗?

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

在 QOpenGLWidget 中,它总是将其上下文设置为与其最接近的顶层 window 共享(如果它是 window,则它本身)。您的理解是正确的,即如果不对 QOpenGLWidget 成员上下文进行 subclass 以完全改变其工作方式,则无法更改它。在 QOpenGLWidgetPrivate::initialize() 函数中,上下文从 defaultFormat 和顶级 shareContext 初始化。如果您想在创建 QOpenGLWidget 之前使用上下文,那么它必须通过全局共享上下文。 Qt::AA_ShareOpenGLContexts 需要在创建 QGuiApplication 对象之前设置。

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

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