共享OpenGL资源的策略

时间:2010-12-05 19:20:42

标签: qt opengl vbo qglwidget

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

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

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

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

谢谢,Cam

1 个答案:

答案 0 :(得分:12)

以下是通常的CAD / MDI应用程序正在做的事情:

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

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

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

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

如果您不在Windows上,请参阅glXCreateContext。这应该会让你走上正轨。

修改

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