簡體   English   中英

OpenGL VAO - 在多種情況下處理VAO

[英]OpenGL VAO's - Handling VAO's in multiple contexts

我遇到了一個問題,我擔心這個問題很難解決,至少就谷歌搜索給我看來而言。

我有一個使用Qt的Editor實用程序,它為編輯器中的不同工具創建多個OpenGL上下文,它們是一個“World”編輯器,它托管我游戲場景的QGLWidget,還有一個材質編輯器,它有一個'預覽'QGLWidget,顯示當前建築材料。

我已經能夠讓上下文共享正常工作,我使用gDEBugger來查看OpenGL上下文,他們正在共享Textures,VBO,着色器等。但是有一條規定讓我想知道這是如何工作的,你不能共享Vertex Array Objects在上下文之間。 據我所知,Vertex數組對象現在已成為標准,我們應該使用它們而不是在沒有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);

這里的錯誤是,只要我將窗口小部件添加到布局,或將其設置為主窗口的中央窗口小部件,它就會刪除上下文,這真的很奇怪。 如果我然后嘗試將上下文從第一個小部件傳遞到第二個小部件

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)我創建了我的第一個小部件,並將其用於所有其他小部件的上下文

QGLWidget* pWidget1 = new QGLWidget();

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

這給了我與第一個方法結束時相同的錯誤,它說QGLWidget :: setContext:Context必須引用這個小部件。

有些東西不在這里,我覺得我錯過了什么。

由於無法共享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,並使用該創建的上下文。 你甚至可以銷毀單個QGLWidgets而不會丟失上下文和其中的數據,只要至少有一個QGLWidget持有它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM