2

OpenGL (Windows 7) を使用して異なる解像度とリフレッシュ レートで複数のディスプレイ (マルチヘッド) を駆動し、デバイス間でテクスチャを共有するにはどうすればよいですか?

マルチヘッド GPU を 1 つ持っています。4つのヘッドを駆動します。(それが問題になる場合は、たまたま AMD FirePro V7900 になります。) ヘッドはすべて「シーン」(頂点とテクスチャ データなど) を共有しますが、ディスプレイで vsync が発生するたびにこのシーンをレンダリングしたい (各ヘッドは本質的に異なるビューポートです)。しかし問題は、ヘッドが異なればリフレッシュ レートも異なる可能性があることです。たとえば、60Hz のディスプレイもあれば、30Hz のディスプレイもあれば、24Hz のディスプレイもあります。

呼び出しブロックを呼び出すとSwapBuffers、次にどのヘッドをレンダリングする必要があるかわかりません。IDirect3DSwapChain9::Presentフラグ付きの Direct3D9 のようなものD3DPRESENT_DONOTWAITと、関連するD3DERR_WASSTILLDRAWING戻り値を期待していました。このアプローチを使用して、次にレンダリングする頭を決定できました。いずれかが成功するまで、さまざまなヘッドをラウンドロビンでポーリングします。しかし、OpenGL で同等のアプローチが何であるかはわかりません。

私はすでにwglSwapIntervalEXT(1)vsync を使用することを発見しました。また、HDC を切り替えて、1 つの HGLRC でさまざまなウィンドウにレンダリングすることもできます。しかし、リフレッシュレートの違いは私を台無しにしています。

単一の HGLRC でこれらすべてのディスプレイを異なるリフレッシュ レートでレンダリングするために何ができるかわかりません。共有テクスチャ (およびその他のリソース) を効率的に使用するには、単一の HGLRC である必要があると思います...間違っている場合は修正してください。リソースが複数の HGLRC で複製されている場合、メモリが 25% に削減されると予想されるため、私にとっては興味深いことではありません (1 つの GPU で 4 つのヘッド: したがって、リソースの 4 つのコピーは必要ありません)。

それが必要であれば、複数のスレッドを使用するという考えにオープンです。

リソースを共有しながら、独自のリフレッシュ レートと解像度でディスプレイを駆動できるように、メイン ループを構成する方法を教えてもらえますか?

4

2 に答える 2

0

コンテキストを共有することで、データを運ぶ OpenGL バッファを共有できます。Windows での呼び出しは nameswglShareListsです。

これを使用すると、すべてのコンテキストがデータを共有しながら、各ウィンドウに独自のスレッドで実行される独自のレンダリング コンテキストを与えることができます。複数ウィンドウの V-Sync は、実際にはマルチスレッド OpenGL が意味を持つ数少ないケースの 1 つです。

于 2012-11-12T21:24:44.517 に答える
0

私は以前にこのようなことをしたことがありません。

独立したリフレッシュ レートを取得するには、実際には複数のスレッドが必要なようです。

OpenGL レンダー コンテキストは、1 つのスレッドでのみアクティブにできます。1 つのスレッドが持つことができるアクティブなレンダリング コンテキストは 1 つだけです。したがって、複数のスレッドでは、複数のレンダー コンテキストが必要になります。

OpenGL コンテキスト間でリソースを共有することが可能です。これにより、リソースを複数回保存する必要がなくなります。

于 2012-11-12T21:29:16.150 に答える