2012-11-06 32 views
6

我遇到了一个恐怕难以解决的问题,至少就谷歌搜索向我展示而言。OpenGL VAO's - 在多种情况下处理VAO

我有一个使用Qt的Editor实用程序,它在编辑器中为不同的工具创建多个OpenGL上下文,它们是一个'World'编辑器,它托管我游戏场景的QGLWidget,以及一个具有'预览'QGLWidget的材质编辑器其中显示当前构建的材料。

我已经能够获得上下文共享工作正常,我使用gDEBugger来查看OpenGL上下文,并且他们共享纹理,VBO,着色器等。但是有一个规定让我想知道这将如何工作,你不能在上下文之间共享顶点数组对象。据我了解,顶点阵列对象现在是标准,我们应该真的使用它们,而不是使用没有VAO的VBO。

我想到的2种方式来解决这个问题,但我完全不觉得要么是理想

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

还有什么其他解决方案可以忽略吗?我也考虑过在一个上下文中使用一切,并为每个需要的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:上下文必须参考这个小部件

2)创建我的第一次窗口小部件和使用它的情况下为所有其他

QGLWidget* pWidget1 = new QGLWidget(); 

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

这给了我,我从我的第一种方法的时候买了同样的错误,它说 QGLWidget来绘图:: setContext:上下文必须参考这个小程序。

东西不对,我觉得我错过了一些东西。

+0

“*我们应该真的将它们用作使用VBO而不使用VAO。”*“如何使用VAO *而不是缓冲区对象?它们*包含对缓冲对象的引用*。 –

+0

我说过使用顶点缓冲区对象而不生成并绑定你自己的顶点数组对象,在那里我已经读过它是兼容模式的一部分,简单地在'0'处使用VAO,并且应该生成并绑定你自己的未来安全代码。 – user1294021

+0

术语“顶点缓冲区对象”是“我使用缓冲区对象作为我的顶点数组的源数据”的缩写。这并不意味着“每帧调用'glVertexAttribPointer'”。使用VAO并不意味着缓冲区对象不再是顶点数据的来源。 –

回答

7

由于无法共享FBO的原因,您无法共享VAO:它们不保存实际数据,但仅仅是数据保存缓冲区对象的集合。持有数据的BO可以共享。

但是,为什么跳到环境共享的篮球呢?只要窗口具有相同的可视格式/ FBConfig/PIXELFORMATDESCRIPTOR,就可以为多个窗口重用单个OpenGL上下文。

看一看下面QGLWidget来绘图构造:

QGLWidget::QGLWidget (
    QGLContext * context, 
    QWidget * parent = 0, 
    const QGLWidget * shareWidget = 0, 
    Qt::WindowFlags f = 0) 

您可以创建与现有QGLContext一个QGLWidget来绘图。要么创建一个独立的QGLContext并将其附加到多个窗口,要么创建一个主QGLWidget,并使用该创建的上下文。您甚至可以销毁单个QGLWidget,而不会丢失上下文及其中的数据,只要至少有一个QGLWidget存储它即可。

+0

我添加了一些关于我正在使用此方法的问题的新信息 – user1294021

+0

单个GL上下文与SDL2项目完美匹配。谢谢。 – GLCraft