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



我遇到了一个我恐怕很难解决的问题,至少就Google搜索而言已经向我展示了。

我有一个使用QT的编辑器实用程序,该实用程序为编辑器中的不同工具创建多个OpenGL上下文,它们是一个"世界"编辑器,它托管了我的游戏场景的QGLWIDGET,并且具有" Preview" QGLWidget的材料编辑器显示当前建造的材料。

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

我想到了两种解决方法,但我不完全认为这是理想的

  1. 在每次渲染之前生成VAO,但这似乎打败了VAO的目的
  2. 使用std ::映射将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:上下文必须参考此窗口小部件。

这里不在,我觉得我缺少一些东西。

您无法共享VAO,因为您不能共享FBO:它们不保留实际数据,而只是保存缓冲对象的数据集合。可以共享数据的BOS。

但是,为什么要跳出上下文共享的篮球呢?只要窗口具有相同的视觉格式/fbconfig/pixelformatDescriptor。

请查看以下QGLWIDGET构造函数:

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

您可以使用现有QGLContext创建QGLWIDGET。要么创建独立的QGLContext并将其附加到多个窗口上,要么创建一个主QGLWidget,并使用该窗口创建的上下文。您甚至可以在不失去上下文和其中的数据的情况下销毁单个QGLWIDGETS,只要至少有一个QGLWIDGET持有它。

最新更新