2010-12-05 24 views
6

私はCADのようなアプリケーション(Qtベース)を作成しています。複数のドキュメントインターフェイスになり、各ドキュメントには約5つのビューポート(QGLWidgetから派生したもの)が含まれます。そのため、フラットシェイダーをアプリケーション全体で共有する必要があります。次に、3D資産(VBOとして保存されたモデル)を各ドキュメント、つまり5つのビューポートで共有する必要があります。OpenGLリソースを共有するための戦略

シェイダープログラムとVBO GLuintのアドレスを共有する限り、私はすべて自動的に動作すると思っていました。私は、各ビューポート/コンテキストはそれがグラフィックカード上の自分のアドレス空間を持っているので、誰かが分かっている場合はお知らせください!

アプリケーションの起動時にシェーダをコンパイルしたいのですが、OpenGLを有効な状態にするために有効なQGLWidgetが必要なので、これは困難です。しかし、リソースを共有するためにQGLWidgetsを(コンストラクタを介して)共有する必要があるため、と表示され、他はインスタンス化されます。しかし、これは、複数のビューをユーザーに一度に表示すると非常に非実用的です。

これはほとんど画期的なものではないので、これは簡単ではありませんが、私は本当に苦労しています。誰かが正しい方向に向かうことができますか?

おかげで、カム

答えて

11

はここで通常のCAD/MDIアプリケーションがやっていることだ。

  • は、彼らがリソースを共有し、十分に役立つ共有コンテキストを作成します。

  • 共有コンテキストのリソースIDにアクセスするための新しいOpenGLレンダリングコンテキストを作成するときは、wglShareListsを使用します。

wglShareListsが等VBOs、テクスチャ、シェーダを共有するために使用することができるだけでなく、表示リストは、(DLSを共有することは、従来の使用、従って関数名です)。

共有コンテキストでリソースを作成する必要があるかどうか、または任意のコンテキストでリソースを作成できるかどうかはわかりません。

窓が開いていない場合はglXCreateContextをご覧ください。それはあなたを軌道に乗せるはずです。

編集:それはメンバーQGLContext::createで抽象化しているように、私はQtのを見てきました

、それが見えます。

+2

優秀! QGLContextは孤立したdudのビットです。私の場合はQGLWidgetの内部にある表示デバイスが作成された後にのみcreateメソッドを実行できます。そこで、シェーダのコンパイルコンテキストとして_invisible_QGLWidgetを作成し、VBOデータを保持するドキュメントの隠しQGLWidgetのコンストラクタ内のconst QGLWidget * shareWidget argとして渡して、そのウィジェットを可視のビューポートQGLWidgetsに渡します。基本的にQGLWidgetツリー階層を作成します。目に見えないGUIコンポーネントを作成するのは難しいですが、移植する際には多くのタイピングを省くことができます。 – cmannett85

+0

@ cmannett85実際には、*クラスであり、http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/ – mlvljr

関連する問題