我正在创建一个类似CAD的应用程序(基于Qt),它将是一个多文档界面,每个文档将包含大约5个视口(从QGLWidget派生)。因此,我需要在整个应用程序中共享我的平面着色器,然后在每个文档(即5个视口)之间共享3D资源(存储为VBO的模型)。
我想只要我在着色器程序和VBO GLuint地址共享所有将自动工作 - 它没有。我想因为每个视口/上下文在显卡上都有自己的地址空间,如果有人知道的话请告知!
我想在应用程序启动时编译着色器,但这很难实现,因为我需要一个有效的QGLWidget来预先将OpenGL置于有效状态。但是,由于我需要共享QGLWidgets(通过它们的构造函数)以使它们共享资源,因此需要创建一个并在其他实例化之前显示。但这是非常不切实际的,因为多个视图可以立即显示给用户。
这一定比我说的要容易,因为它不是突破性的东西,但我真的很挣扎 - 有人能指出我正确的方向吗?
谢谢,Cam
答案 0 :(得分:12)
以下是通常的CAD / MDI应用程序正在做的事情:
他们创建了一个共享上下文,可以很好地共享资源。
他们在创建新的OpenGL渲染上下文时使用wglShareLists
来提供对共享上下文的资源ID的访问。
wglShareLists
可用于共享VBO,纹理,着色器等,而不仅仅是显示列表(共享DL是传统用法,因此也就是函数名称)。
我不记得您是否需要使用共享上下文创建资源,或者您是否可以在任何上下文中创建它们。
如果您不在Windows上,请参阅glXCreateContext
。这应该会让你走上正轨。
修改强>
我看过Qt,看起来它被成员QGLContext::create
抽象了。