共享OpenGL资源的策略

cma*_*t85 6 opengl qt vbo qglwidget

我正在创建一个类似CAD的应用程序(基于Qt),它将是一个多文档界面,每个文档将包含大约5个视口(从QGLWidget派生).因此,我需要在整个应用程序中共享我的平面着色器,然后在每个文档(即5个视口)之间共享3D资源(存储为VBO的模型).

我想只要我在着色器程序和VBO GLuint地址共享所有将自动工作 - 它没有.我想因为每个视口/上下文在显卡上都有自己的地址空间,如果有人知道更好请告知!

我想在应用程序启动时编译着​​色器,但这很难实现,因为我需要一个有效的QGLWidget来预先将​​OpenGL置于有效状态.但是,由于我需要共享QGLWidgets(通过它们的构造函数)以使它们共享资源,因此需要先创建并显示其他资源,然后才能实例化其他资源.但这是非常不切实际的,因为多个视图一次显示给用户.

这一定比我说的要容易,因为它不是突破性的东西,但我真的很挣扎 - 有人能指出我正确的方向吗?

谢谢,Cam

Str*_*ger 12

以下是通常的CAD/MDI应用程序正在执行的操作:

  • 他们创建了一个共享的上下文,可以很好地共享资源.

  • 他们wglShareLists在创建新的OpenGL渲染上下文时使用它来访问共享上下文的资源ID.

wglShareLists 可用于共享VBO,纹理,着色器等,不仅显示列表(共享DL是传统用法,因此是函数名称).

我不记得您是否需要使用共享上下文创建资源,或者您是否可以在任何上下文中创建它们.

如果你不在窗户上,请看glXCreateContext.这应该会让你走上正轨.

编辑:

我看过Qt,看起来它被成员抽象了QGLContext::create.

  • 优秀!QGLContext有点孤立,创建方法只能在创建显示设备后运行,在我的情况下是在QGLWidget中.因此,我将创建一个_invisible_ QGLWidget作为我的着色器编译上下文,然后将其作为const QGLWidget*shareWidget arg传递给文档的隐藏QGLWidget的构造函数,该构造函数保存VBO数据,然后将该窗口小部件传递到可见视口QGLWidgets.基本上创建一个QGLWidget树层次结构.制作隐形GUI组件并不是很优雅,但在移植时它会节省很多打字. (2认同)