我遇到了一个问题,恐怕很难解决,至少就谷歌搜索显示的情况而言。
我有一个编辑器实用程序,它使用Qt为编辑器中的不同工具创建多个OpenGL上下文,它们是一个“World”编辑器,它承载了我的游戏场景的QGLWidget,以及一个具有“预览”QGLWidget的材料编辑器,该编辑器显示当前构建的材料。
我已经能够让上下文共享工作得很好,我使用gDEBugger查看OpenGL上下文,它们共享纹理、VBO、着色器等。但是有一项规定让我想知道这将如何工作,您不能在上下文之间共享顶点数组对象。据我所知,顶点数组对象是现在的标准,我们应该使用它们,而不是使用没有VAO的VBO。
我想了两种方法来解决这个问题,但我不认为这两种方法都是理想的
还有什么其他的解决办法我忽略了吗?我还考虑过以某种方式在一个上下文中拥有一切,并为每个所需的opengl小部件使用单独的视图端口,我希望这是可能的,但我没有办法通过Qt和它的QGLWidget找到它。
编辑
好的,所以我试着让它发挥作用,但是它让我非常悲伤,我尝试了两种不同的方法,它们都会导致我的错误。
1)我创建一个QGLContext,然后在创建它们时将它传递给我的QGLWidgets。
QGLFormat fmt = QGLFormat();
QGLContext* pContext = new QGLContext(fmt);
QGLWidget* pWidget1 = new QGLWidget(pContext);
someLayout->addWidget(pWidget1);
QGLWidget* pWidget2 = new QGLWidget(pContext);
anotherLayout->addWidget(pWidget2);这里的错误是,一旦我将小部件添加到布局中,或者将其设置为主窗口的中心小部件,它就会删除上下文,非常奇怪。如果我尝试将上下文从第一个小部件传递到第二个
QGLFormat fmt = QGLFormat();
QGLContext* pContext = new QGLContext(fmt);
QGLWidget* pWidget1 = new QGLWidget(pContext);
someLayout->addWidget(pWidget1);
pContext = (QGLContext*)pWidget1->context();
QGLWidget* pWidget2 = new QGLWidget(pContext);
anotherLayout->addWidget(pWidget2);我得到一个Qt错误,它表示QGLWidget::setContext: Context必须引用这个小部件
2)我创建了我的第一个小部件,并为所有其他部件使用它的上下文
QGLWidget* pWidget1 = new QGLWidget();
QGLContext* pContext = (QGLContext*)pWidget->context();
QGLWidget* pWidget2 = new QGLWidget(pContext);这给了我相同的错误,我从我的第一个方法结束,它说QGLWidget::setContext: Context必须引用这个小部件。
有些东西不在这里,我觉得我错过了一些东西。
发布于 2012-11-06 20:09:50
您不能共享VAOs的原因与不能共享FBO的原因相同:它们不包含实际数据,而只是数据存储缓冲区对象的集合。保存您可以共享的数据的BOs。
然而,为什么要跳过上下文共享的循环呢?只要窗口具有相同的视觉格式/ OpenGL / PIXELFORMATDESCRIPTOR,就可以为多个窗口重用单个FBConfig上下文。
请查看以下QGLWidget构造函数:
QGLWidget::QGLWidget (
QGLContext * context,
QWidget * parent = 0,
const QGLWidget * shareWidget = 0,
Qt::WindowFlags f = 0 )您可以使用现有的QGLWidget创建QGLContext。要么创建一个独立的QGLContext并将其附加到多个窗口,要么创建一个主QGLWidget,并使用该窗口创建的上下文。您甚至可以销毁单个QGLWidgets,而不必松开上下文和其中的数据,只要至少有一个QGLWidget保存它。
https://stackoverflow.com/questions/13258345
复制相似问题