首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL VAO's -在多个上下文中处理VAO

OpenGL VAO's -在多个上下文中处理VAO
EN

Stack Overflow用户
提问于 2012-11-06 19:52:26
回答 1查看 4.4K关注 0票数 9

我遇到了一个问题,恐怕很难解决,至少就谷歌搜索显示的情况而言。

我有一个编辑器实用程序,它使用Qt为编辑器中的不同工具创建多个OpenGL上下文,它们是一个“World”编辑器,它承载了我的游戏场景的QGLWidget,以及一个具有“预览”QGLWidget的材料编辑器,该编辑器显示当前构建的材料。

我已经能够让上下文共享工作得很好,我使用gDEBugger查看OpenGL上下文,它们共享纹理、VBO、着色器等。但是有一项规定让我想知道这将如何工作,您不能在上下文之间共享顶点数组对象。据我所知,顶点数组对象是现在的标准,我们应该使用它们,而不是使用没有VAO的VBO。

我想了两种方法来解决这个问题,但我不认为这两种方法都是理想的

  1. 在每次渲染之前生成VAO,但这似乎违背了VAO的目的
  2. 使用std::map将GL上下文映射到VAO,如果当前上下文没有此VAO,则为所述上下文生成一个VAO,这看起来很糟糕,甚至可能不起作用。

还有什么其他的解决办法我忽略了吗?我还考虑过以某种方式在一个上下文中拥有一切,并为每个所需的opengl小部件使用单独的视图端口,我希望这是可能的,但我没有办法通过Qt和它的QGLWidget找到它。

编辑

好的,所以我试着让它发挥作用,但是它让我非常悲伤,我尝试了两种不同的方法,它们都会导致我的错误。

1)我创建一个QGLContext,然后在创建它们时将它传递给我的QGLWidgets。

代码语言:javascript
复制
QGLFormat    fmt = QGLFormat();
QGLContext*  pContext = new QGLContext(fmt);

QGLWidget*   pWidget1 = new QGLWidget(pContext);
someLayout->addWidget(pWidget1);

QGLWidget*   pWidget2 = new QGLWidget(pContext);
anotherLayout->addWidget(pWidget2);

这里的错误是,一旦我将小部件添加到布局中,或者将其设置为主窗口的中心小部件,它就会删除上下文,非常奇怪。如果我尝试将上下文从第一个小部件传递到第二个

代码语言:javascript
复制
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)我创建了我的第一个小部件,并为所有其他部件使用它的上下文

代码语言:javascript
复制
QGLWidget* pWidget1 = new QGLWidget();

QGLContext* pContext = (QGLContext*)pWidget->context();
QGLWidget* pWidget2 = new QGLWidget(pContext);

这给了我相同的错误,我从我的第一个方法结束,它说QGLWidget::setContext: Context必须引用这个小部件。

有些东西不在这里,我觉得我错过了一些东西。

EN

回答 1

Stack Overflow用户

发布于 2012-11-06 20:09:50

您不能共享VAOs的原因与不能共享FBO的原因相同:它们不包含实际数据,而只是数据存储缓冲区对象的集合。保存您可以共享的数据的BOs。

然而,为什么要跳过上下文共享的循环呢?只要窗口具有相同的视觉格式/ OpenGL / PIXELFORMATDESCRIPTOR,就可以为多个窗口重用单个FBConfig上下文。

请查看以下QGLWidget构造函数:

代码语言:javascript
复制
QGLWidget::QGLWidget (
    QGLContext * context, 
    QWidget * parent = 0, 
    const QGLWidget * shareWidget = 0, 
    Qt::WindowFlags f = 0 )

您可以使用现有的QGLWidget创建QGLContext。要么创建一个独立的QGLContext并将其附加到多个窗口,要么创建一个主QGLWidget,并使用该窗口创建的上下文。您甚至可以销毁单个QGLWidgets,而不必松开上下文和其中的数据,只要至少有一个QGLWidget保存它。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13258345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档