9

少なくとも Google 検索でわかる限り、解決が非常に難しいのではないかと懸念している問題に遭遇しました。

Qt を使用してエディタ ユーティリティを使用して、エディタ内のさまざまなツール用に複数の OpenGL コンテキストを作成します。それらは、ゲーム シーンの QGLWidget をホストする「ワールド」エディタと、現在表示する「プレビュー」QGLWidget を持つマテリアル エディタです。構築材料。

コンテキスト共有を正常に機能させることができました。gDEBugger を使用して OpenGL コンテキストを表示し、テクスチャ、VBO、シェーダーなどを共有しています。コンテキスト間。私が理解しているように、頂点配列オブジェクトは現在標準であり、VAO なしで VBO を使用するのではなく、実際に使用する必要があります。

これを回避する2つの方法を考えましたが、どちらも理想的だとは思いません

  1. 各レンダリングの前に VAO を生成しますが、これは VAO の目的を無効にしているようです
  2. std::map を使用して GL コンテキストを VAO にマップします。現在のコンテキストにこの VAO がない場合は、そのコンテキスト用の VAO を生成します。

私が見落としている他の解決策は何ですか?また、何とかすべてを 1 つのコンテキストにまとめ、必要な opengl ウィジェットごとに個別のビューポートを使用することも検討しました。

編集

さて、私はこれを機能させようとしましたが、それは私に多くの悲しみを与えています.2つの異なる方法を試しましたが、どちらもエラーを引き起こしています.

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);

ここでのエラーは、ウィジェットをレイアウトに追加するか、それをメイン ウィンドウの中央ウィジェットとして設定するとすぐに、コンテキストが削除されるということです。これは非常に奇妙なことです。次に、最初のウィジェットから2番目のウィジェットにコンテキストを渡そうとすると

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);

QGLWidget::setContext: Context must refer to this widget という Qt エラーが表示されます

2) 最初のウィジェットを作成し、そのコンテキストを他のすべてのウィジェットに使用します

QGLWidget* pWidget1 = new QGLWidget();

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

これにより、最初のメソッドの最後から得たのと同じエラーが表示されます。QGLWidget::setContext: Context must refer to this widget と表示されます。

ここで何かがうまくいかず、何かが欠けているように感じます。

4

1 に答える 1

8

FBO を共有できないのと同じ理由で、VAO を共有することはできません。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 を作成してそのコンテキストを使用します。少なくとも 1 つの QGLWidget がそれを保持している限り、コンテキストとその中のデータを失うことなく、単一の QGLWidget を破棄することさえできます。

于 2012-11-06T20:09:50.907 に答える