2016-04-24 8 views
3

複数のOpenGLコンテキストがあり、それぞれが独自のプロセスであれば、ドライバは何らかの形でデバイスを仮想化するので、各プログラムはGPUを排他的に実行すると考えます。つまり、1つのプログラムがglEnableを呼び出すと、もう1つのプログラムはそれに気づくことはありません。OpenGLですべての状態を一度に保存できますか?

これは、それ以外の場合には、保存状態とそれ以降に復元するためにglGetトンの呼び出しで行うことができます。明らかに、ドライバはより効率的にそれを行います。しかし、ユーザー空間では、ステートに加えた変更を追跡し、それらを選択的に処理する必要があります。たぶん私は何かが欠落しているかもしれませんが、フレームバスのためにViewportを調整し、以前の状態に変更を取り消すだけの方がいいと思っていました。

コンテキストスイッチの効果を単一のプログラム内で達成する方法がありますか?

+3

さて、同じプログラム内で複数のGLコンテキストを使用するだけで、お互いに状態を分けることができます。このようなコンテキストは実際のオブジェクトを共有できるため、同じデータを操作することはできます。 – derhass

答えて

1

コンテキスト切り替えの効果を1つのプログラム内で達成する方法がありますか?

1つのプロセスで任意の数のOpenGLコンテキストを作成し、それらの間で切り替えることができます。また、最新のGPUでは、OpenGLコンテキストの状態は、実際にGPUで起こっていることとほとんど似ていません。

1

pre-Core OpenGLの場合は、GL状態を保存するglPushAttrib()/glPopAttrib()があります。

あなたは自分のクライアント側の状態のシャドーイングを書く方がよいでしょう。

1

ステートマシン(および後述のコマンドキュー)は、各コンテキストに固有のものです。あなたが思っているよりはるかに高いレベルです。状態は一般的にusermodeできれいに包まれています。

単一のプロセスでのコンテキスト切り替えに関しては、GLの各レンダーコンテキストが非同期であることに注意してください。この問題を軽減するために、コンテキスト切り替え中に暗黙のフラッシュが生成されます。コンテキストが単一のスレッドでのみ使用されている限り、これは一般的には適切ですが、おそらくパフォーマンスに悪影響を及ぼします。

関連する問題