4

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

我知道我可以这样做:

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

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

  1. 创建 QOpenGLContext
  2. 创建 QOpenGLWidget,提供现有的上下文并使其共享

这可能吗?

4

1 回答 1

3

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

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

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

另外,我不知道这是否会改变任何东西,但QOpenGLContext 说它也可以共享帧缓冲区对象。

于 2016-01-07T22:35:41.697 回答