3

画面にアニメーションの読み込み画面 (OpenGL でレンダリング) が表示されている間に、OpenGL テクスチャを含むいくつかのメッシュを読み込みたいと考えています。

したがって、2 つのスレッドから同じ GL コンテキストにアクセスできないため、もちろん機能しない 2 番目のスレッドで読み込みを行います。

私は SDL 1.2 を使用していますが、すべてがプラットフォームに依存しない必要があるため、wgl のようなものは使用できません。

私にはどのような可能性がありますか?

4

3 に答える 3

3

ピクセルバッファオブジェクトを使用して、画像データのアドレス空間マッピングを作成します(glMapBuffer)。マップされたOpenGLメモリ領域には、プロセスのすべてのスレッドからアクセスできます。セカンダリスレッドを使用して画像データをこれにコピーし、次にglUnmapBufferメインglTexImageスレッドのPBOからコピーします。アンマッピングとテクスチャアップロードの両方が非同期で行われるため、前の画像が高速メモリに転送されている間に、次の画像をすでに処理できます。

必要なのは、次に実行するタスクとこのタスクが終了したときにスレッド間で通信する方法だけです。

于 2012-12-15T16:21:23.627 に答える
1

はい、別のスレッドで作成されたリソースにアクセスできます。必要なことは、セカンダリ スレッドでセカンダリ opengl コンテキストを作成し、wglShareLists を使用して 2 つのコンテキスト間でデータを共有することです。

もちろん、メイン スレッドで使用する前に、再度バインドする必要があります。

この質問も確認してください SDL / OpenGL: Implementing a "Loading thread"

于 2012-12-15T16:29:42.977 に答える
1

これは確かに最も洗練されたソリューションではありませんが、空のバーでロード画面を描画し、いくつかのアセットをロードしてバーを増やしてから、もう一度描画することができます. すべてをロードするまで繰り返します。
疑似で:

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);
}  

これは本当に進むべき道ではありませんが、簡単で汚い方法が必要な場合に機能します。

于 2012-12-15T14:33:52.467 に答える