我遇到了一个恐怕难以解决的问题,至少就谷歌搜索向我展示而言。OpenGL VAO's - 在多种情况下处理VAO
我有一个使用Qt的Editor实用程序,它在编辑器中为不同的工具创建多个OpenGL上下文,它们是一个'World'编辑器,它托管我游戏场景的QGLWidget,以及一个具有'预览'QGLWidget的材质编辑器其中显示当前构建的材料。
我已经能够获得上下文共享工作正常,我使用gDEBugger来查看OpenGL上下文,并且他们共享纹理,VBO,着色器等。但是有一个规定让我想知道这将如何工作,你不能在上下文之间共享顶点数组对象。据我了解,顶点阵列对象现在是标准,我们应该真的使用它们,而不是使用没有VAO的VBO。
我想到的2种方式来解决这个问题,但我完全不觉得要么是理想
- 生成VAO的每个渲染之前,但这似乎打败的VAO的 目的
- 使用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:上下文必须参考这个小程序。
东西不对,我觉得我错过了一些东西。
“*我们应该真的将它们用作使用VBO而不使用VAO。”*“如何使用VAO *而不是缓冲区对象?它们*包含对缓冲对象的引用*。 –
我说过使用顶点缓冲区对象而不生成并绑定你自己的顶点数组对象,在那里我已经读过它是兼容模式的一部分,简单地在'0'处使用VAO,并且应该生成并绑定你自己的未来安全代码。 – user1294021
术语“顶点缓冲区对象”是“我使用缓冲区对象作为我的顶点数组的源数据”的缩写。这并不意味着“每帧调用'glVertexAttribPointer'”。使用VAO并不意味着缓冲区对象不再是顶点数据的来源。 –