2016-11-25 8 views
0

同じウィンドウ(QSplitterアーキテクチャで区切られている)にある多くのQOpenGLWidgetでは、異なる視点のシーンを表示したいと考えています。 重要なことは、シーンデータ(ジオメトリとテクスチャ)をGPUに一度だけ保存したいということです。 しかし、各QOpenGLWidgetには独自のQOpenGLContextがあります。多くのQOpenGLWidgetで表示するためにfboでレンダリングするためのグローバルOpenGLコンテキスト

私の考えは、シーンをFrameBufferObject(QFrameBufferObjectではなく)にレンダリングし、関係するQOpenGLWidgetで結果のテクスチャを使用する独立したコンテキストを作成することでした。

もっと技術的には、私のアプローチは新しいQOpenGLContextとQOffscreenSurfaceを作成することでした。 しかし、私のQOpenGLContunctionによって与えられた結果のQOpenGLFunctionsを使用する場合、作成したQOpenGlContextが有効であることを確認しても、セグメンテーション違反で停止します。

より一般的なやり方では、QOpenGLContext、サーフェス(私の場合はQOffscreenSurface)、およびmakeCurrent関数の役割を理解することは難しいです。

私の要求は、これを行う良い方法と、なぜセグメンテーションフォルトが発生するのかを理解することです。

+0

同じトップレベルウィンドウ内のすべてのQOpenGLWidgetsは、ウィンドウ自体の「合成」を行うためにQtが使用する内部GLコンテキストと共有しているため、すでに互いに共有していることに注意してください(2DテクスチャとしてQOpenGLWidgets、他のウィジェットなど)。したがって、これらのコンテキスト間で物事を共有するために特別なことを行う必要はありません。さらに、これらのコンテキストをアプリケーションのすべてのトップレベルウィンドウで共有するフラグもあります。 – peppe

+0

はい、共有されていても、頂点配列オブジェクトは共有されません!私は本当にこの種の問題に対処することを避けたい。テクスチャへのレンダリングは、私のレンダリングを集中させる良い解決策だとは思いませんか? –

+0

確かに、あなたが望むならそれを行うことができます。ここでも、FBOは共有されませんが、バッキングテクスチャまたはレンダーバッファは共有されます。 – peppe

答えて

0

私の問題の答えが戻ってきます。

実際には、最初に初期化されたQOpenGLWidgetのコンテキストをグローバルコンテキストとして使用して、新しいコンテキストを作成しないようにしました。

難しいのは、グローバルコンテキストが必要になるたびに最新のものにすることです(GPUやfboでデータを追加する)。

paintGLの手順は単純です: - グローバルコンテキストを最新のものにします。 - fbo録音を開始します。 - シーンをレンダリングします。 - fbo録音を停止します。 - QOpenGLWidgetコンテキストを最新の状態にします。 - fbo結果を画面上にレンダリングします。

私はgDEBuggerを使用して自分のメモリをチェックしました。私のメモリはすべてグローバルコンテキストにあり(一度だけ保存されます)。

関連する問題