小编use*_*021的帖子

OpenGL VAO - 在多种情况下处理VAO

我遇到了一个问题,我担心这个问题很难解决,至少就谷歌搜索给我看的那样.

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

我已经能够让上下文共享正常工作,我使用gDEBugger来查看OpenGL上下文,他们正在共享Textures,VBO,着色器等.但是有一条规定让我想知道这是如何工作的,你不能共享Vertex Array Objects在上下文之间.据我所知,顶点数组对象现在是标准,我们应该真正使用它们,而不是使用没有VAO的VBO.

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

  1. 在每次渲染之前生成VAO,但这似乎打败了VAO的目的
  2. 使用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);
Run Code Online (Sandbox Code Playgroud)

这里的错误是,只要我将窗口小部件添加到布局,或将其设置为主窗口的中央窗口小部件,它就会删除上下文,这真的很奇怪.如果我然后尝试将上下文从第一个小部件传递到第二个小部件

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);
Run Code Online (Sandbox Code Playgroud)

我得到一个Qt错误说QGLWidget :: setContext:Context必须引用这个小部件

2)我创建了我的第一个小部件,并将其用于所有其他小部件的上下文

QGLWidget* pWidget1 = new QGLWidget();

QGLContext* pContext = (QGLContext*)pWidget->context();
QGLWidget* pWidget2 = new QGLWidget(pContext);
Run Code Online (Sandbox Code Playgroud)

这给了我与第一个方法结束时相同的错误,它说QGLWidget :: …

c++ opengl qt

8
推荐指数
1
解决办法
3382
查看次数

标签 统计

c++ ×1

opengl ×1

qt ×1