我有一个现有的 OpenGL 上下文,我想与一个新的 QOpenGLWidget 共享。
我知道我可以这样做:
- 创建 QOpenGLWidget
- 等到 initializeGL 被调用并保存上下文
- 创建新的 QOpenGLContext,并使其与保存的上下文共享
但是,我想按其他顺序进行:
- 创建 QOpenGLContext
- 创建 QOpenGLWidget,提供现有的上下文并使其共享
这可能吗?
我有一个现有的 OpenGL 上下文,我想与一个新的 QOpenGLWidget 共享。
我知道我可以这样做:
但是,我想按其他顺序进行:
这可能吗?
编辑,我对 QOpenGLFramebufferObject 了解不多,所以忽略我之前的答案内容。
在 QOpenGLWidget 中,它总是将其上下文设置为与其最近的顶级窗口(或者如果它是一个窗口,则它自己)共享。您的理解是正确的,如果不继承 QOpenGLWidget 成员上下文以完全改变它的工作方式,就无法更改它。在 QOpenGLWidgetPrivate::initialize() 函数中,上下文是从 defaultFormat 和顶级 shareContext 初始化的。如果您想在创建 QOpenGLWidget 之前使用上下文,那么它必须通过全局共享上下文。Qt::AA_ShareOpenGLContexts 需要在创建 QGuiApplication 对象之前设置。
您需要等到 QGuiApplication 初始化全局上下文后才能尝试访问它。由于 global_share_context 是 QOpenGLContext 类的静态成员,因此您可以创建任何 QOpenGLContext 并通过 context.globalShareContext() 访问它。然后只需删除您的初始 QOpenGLContext。您创建的任何 QOpenGLWidget 都会自动与该上下文共享。如果您可以在 create() 特殊上下文之前找到指向全局共享上下文的指针的方法,那么您可以与全局上下文共享,并且您可以进行双向共享。共享是通过彼此共享的整个共享上下文组进行的,因此与一个上下文的任何共享都与整个组共享。
另外,我不知道这是否会改变任何东西,但QOpenGLContext 说它也可以共享帧缓冲区对象。