5

OpenGL ES で大きなテクスチャを使用する iPad アプリを開発しています。シーンが最初に読み込まれると、下の図に示すように、数フレームの間、天井に大きな黒いアーティファクトが表示されます。より高いレベルのミップマップがまだ埋められていないかのようです。後続のフレームでは、天井が正しく表示されます。

この問題は、ミップマッピングを使い始めたときにのみ現れ始めました。考えられる説明の 1 つは、glGenerateMipmap() 呼び出しが非同期で動作し、(別のプロセスまたはおそらく GPU で) ミップマップ作成ワーカーを生成して戻ることです。

これは可能ですか、それとも間違ったツリーを吠えていますか?

より高いミップマップ レベルは存在しません

4

3 に答える 3

3

単一のコンテキスト内では、すべての操作が厳密に順番に実行されているように見えます。ただし、最新の返信で、2 番目のスレッドを使用することについて言及しました。これを行うには、2 つ目の共有コンテキストを作成しておく必要があります。OpenGL コンテキストに再度入ることは常に違法です。すでに共有コンテキストを使用している場合でも、従わなければならない同期規則がいくつかあります。これについては、http://developer.apple.com/library/ios/ipad/#DOCUMENTATION/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.htmlに記載されています。

于 2012-03-17T05:47:26.523 に答える
2

同期する必要があります。OpenGL 自体には、スレッド化の実際の概念はありません (CPU と GPU 間の暗黙の非同期ダイアログを除く)。

診断する良い方法は、に切り替えることGL_LINEAR_MIPMAP_LINEARです。低解像度のミップ マップが後で到着しないという問題が本当に問題である場合は、現在の黒または正しい効果ではなく、天井の厄介な領域が互いに混ざり合っていることがわかります。

出力に基づく 2 番目の推測は、ある種の深度バッファーのクリアの問題です。

于 2012-03-15T20:01:57.940 に答える
1

@Tommy の提案に従い、に切り替えましたGL_LINEAR_MIPMAP_LINEAR。これで、ブラック オア コレクト エフェクトが、コレクトとブラックの間のフェードに変更されました。

OpenGL がパイプラインであること (したがって、状態を取得するか、明示的に同期しない限り非同期であること) は誰もが知っていますが、それを忘れがちだと思います。この場合、描画ではなく、テクスチャの読み込みと設定を行っていました。

問題の性質を確認した後、すべてのテクスチャをロードした後に glFinish() を追加したところ、問題はなくなりました。(ちなみに、私の描画ループはフォアグラウンドにあり、テクスチャ読み込みループはバックグラウンドにあります。これは非常に時間がかかり、インタラクティブ性が損なわれるためです。また、これはプラットフォームによって異なる可能性があるため、iPad 2 で iOS5 を使用しています)

于 2012-03-16T18:47:17.413 に答える