画面にアニメーションの読み込み画面 (OpenGL でレンダリング) が表示されている間に、OpenGL テクスチャを含むいくつかのメッシュを読み込みたいと考えています。
したがって、2 つのスレッドから同じ GL コンテキストにアクセスできないため、もちろん機能しない 2 番目のスレッドで読み込みを行います。
私は SDL 1.2 を使用していますが、すべてがプラットフォームに依存しない必要があるため、wgl のようなものは使用できません。
私にはどのような可能性がありますか?
画面にアニメーションの読み込み画面 (OpenGL でレンダリング) が表示されている間に、OpenGL テクスチャを含むいくつかのメッシュを読み込みたいと考えています。
したがって、2 つのスレッドから同じ GL コンテキストにアクセスできないため、もちろん機能しない 2 番目のスレッドで読み込みを行います。
私は SDL 1.2 を使用していますが、すべてがプラットフォームに依存しない必要があるため、wgl のようなものは使用できません。
私にはどのような可能性がありますか?
ピクセルバッファオブジェクトを使用して、画像データのアドレス空間マッピングを作成します(glMapBuffer
)。マップされたOpenGLメモリ領域には、プロセスのすべてのスレッドからアクセスできます。セカンダリスレッドを使用して画像データをこれにコピーし、次にglUnmapBuffer
メインglTexImage
スレッドのPBOからコピーします。アンマッピングとテクスチャアップロードの両方が非同期で行われるため、前の画像が高速メモリに転送されている間に、次の画像をすでに処理できます。
必要なのは、次に実行するタスクとこのタスクが終了したときにスレッド間で通信する方法だけです。
はい、別のスレッドで作成されたリソースにアクセスできます。必要なことは、セカンダリ スレッドでセカンダリ opengl コンテキストを作成し、wglShareLists を使用して 2 つのコンテキスト間でデータを共有することです。
もちろん、メイン スレッドで使用する前に、再度バインドする必要があります。
この質問も確認してください SDL / OpenGL: Implementing a "Loading thread"
これは確かに最も洗練されたソリューションではありませんが、空のバーでロード画面を描画し、いくつかのアセットをロードしてバーを増やしてから、もう一度描画することができます. すべてをロードするまで繰り返します。
疑似で:
loadgraphics(){
int progress=0;
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
glClear(GL_COLOR_BUFFER_BIT);
//draw you loading bar from 0 to progress
//load something
++progress;
SwapBuffers(hdc);
}
これは本当に進むべき道ではありませんが、簡単で汚い方法が必要な場合に機能します。