我有一个现有的OpenGL上下文,希望与新的QOpenGLWidget共享。
我知道可以这样做:
- 创建QOpenGLWidget
- 等待调用initializeGL并保存上下文
- 创建新的QOpenGLContext,并与保存的上下文共享
然而,我想按照另一种顺序实现:
- 创建QOpenGLContext
- 创建QOpenGLWidget,提供现有的上下文并进行共享
这可行吗?
我有一个现有的OpenGL上下文,希望与新的QOpenGLWidget共享。
我知道可以这样做:
然而,我想按照另一种顺序实现:
这可行吗?
编辑,我对QOpenGLFramebufferObject不太了解,所以请忽略我之前的回答内容。
在QOpenGLWidget中,它总是将其上下文设置为与最近的顶层窗口(或自身)共享。您正确地理解了,在不子类化QOpenGLWidget以完全更改其工作方式的情况下,没有改变QOpenGLWidget成员上下文的方法。在QOpenGLWidgetPrivate :: initialize()函数中,上下文从defaultFormat和顶级shareContext初始化。如果您想在创建QOpenGLWidget之前使用上下文,则必须通过全局共享上下文进行操作。必须在创建QGuiApplication对象之前设置Qt :: AA_ShareOpenGLContexts。
您需要等待QGuiApplication初始化全局上下文后才能尝试访问它。由于global_share_context是QOpenGLContext类的静态成员,因此您只需创建任何QOpenGLContext并通过context.globalShareContext()访问即可。然后只需删除您的初始QOpenGLContext。您创建的任何QOpenGLWidget都会自动与该上下文共享。如果您可以找到在创建特殊上下文之前获取全局共享上下文指针的方法,则可以共享全局上下文,并且您可以继续进行,因为共享双向传递。共享是通过与彼此共享的整个共享上下文组进行的,因此与一个上下文的共享与整个组共享。
此外,我不知道这是否会改变任何内容,但QOpenGLContext表示它也可以共享帧缓冲对象。
QWindow
,它创建了一个 GL 上下文并与外部框架共享:https://github.com/dava/dava.framework/blob/80bfa3b832fe1a24d50783828868f0f73f1ab31b/Sources/Tools/QtTools/DavaGLWidget/davaglwidget.cpp - Dmitry Sazonov