4

3Dグラフィックスとコマンドラインを表示するopenglアプリケーションを作成したいと思います。どちらも重いプロセスなので、別々のスレッドにしたいです。2つの異なるビューポートでこれにアプローチできると思いましたが、openglでスレッドを処理する方法を知りたいです。

私が読んでいることによると、Openglは非同期であり、異なるスレッドからその関数を呼び出すことは非常に問題になる可能性があります。この問題に取り組むために使用できる方法はありますか?理想的には、透明感のある効果を使用して3Dグラフィックスの上にコマンドラインを描画したいと思います...(これは私が推測するビューポートでは不可能です)

ソリューションが移植可能であることが重要です。

ありがとう!

4

3 に答える 3

4

オーバーレイを使用して、やりたいことを実現できる可能性があります。
オーバーレイはやや時代遅れの機能ですが、ほとんどのセットアップで引き続きサポートされるはずです。基本的に、オーバーレイは別のGLコンテキストであり、別のレイヤーと同じウィンドウにレンダリングされ、元のコンテキストでウィンドウに描画されたものの上に描画されます。
あなたはここでそれについて読むことができます。

于 2009-04-12T17:53:12.140 に答える
2

画面に描画するために 2 つのスレッドを作成しようとするのではなく、MVC パターンを使用してモデルをスレッドセーフにする必要があると思います。次に、フレームごとにモデルから必要な情報を取得して画面に表示するスレッドを 1 つ作成し、モデルのみを管理する別の 2 つのスレッド (1 つはグラフィック用、もう 1 つはコマンド ライン用) を作成します。

たとえば、3D グラフィックスを含む Simulation クラスと、コマンド ラインを含む CommandLine クラスがあります。これらの各クラスは OpenGL をまったく使用しません。物が 3D 空間にある場所などのデータのみを管理し、コマンドラインの場合は画面上の行のキューを管理します。次に、opengl スレッドは、必要な情報を取得するために、フレームごとにこれらのクラスのスレッドセーフ関数を照会できます。たとえば、3D オブジェクトの位置を取得して画面上に描画し、コマンド ラインに表示する行を取得して描画します。

于 2009-04-13T03:40:20.390 に答える
1

2つのビューポートでは実行できません。

各OpenGLコンテキストは、それが作成されたのと同じスレッドから使​​用する必要があります。

それぞれ独自のコンテキストを持つ2つの別々のウィンドウハンドルは、2つの別々のスレッドから安全にセットアップして使用できますが、1つのウィンドウに2つのビューポートを含めることはできません。


このためのアイデアを見るのに適した場所はOpenSceneGraphです。 スレッド化で多くの作業を行い、処理を高速化し、非常に大きなシーンで一定の高いフレームレートを維持しようとします。

私はそれをうまく埋め込み、2つの別々のスレッドから使​​用しましたが、OSGには、この種のシナリオを支援するための多くのチェックがあります。

于 2009-04-12T17:39:54.810 に答える