c – 具有共享OpenGL上下文的QOpenGLWidget?

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

我知道我可以这样做:

>创建QOpenGLWidget
>等到调用initializeGL并保存上下文
>创建新的QOpenGLContext,并使其与保存的上下文共享

但是,我想以其他顺序执行此操作:

>创建QOpenGLContext
>创建QOpenGLWidget,提供现有上下文并使它们共享

这可能吗?

最佳答案 编辑,我对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共享帧缓冲对象.

点赞