2012-03-15 16 views
4

OpenGL ESで大きなテクスチャを使用するiPadアプリを開発しています。シーンが最初にロードされると、下の図に示すように、いくつかのフレームで天井に大きな黒いアーティファクトが表示されます。これはミップマップのより高いレベルがまだ塗りつぶされていないかのようです。後続のフレームでは、天井が正しく表示されます。iOS glGenerateMipmapは同期ですか、それとも非同期ですか?

この問題は、ミップマッピングを使用し始めたときに表示され始めました。 1つの可能な説明は、glGenerateMipmap()呼び出しが非同期的に作業を行い、ミップマップ作成ワーカー(別のプロセスまたはおそらくGPU)を作成して戻すことです。

これが可能ですか、間違ったツリーを吠えますか?

Higher mipmap levels don't exist

答えて

2

それが同期する必要があります。 OpenGL自体には、スレッド処理の実際の概念はありません(CPUとGPUの間の暗黙の非同期対話を除く)。

良い診断方法は、GL_LINEAR_MIPMAP_LINEARに切り替えることです。それが真の問題であれば、ミップマップの解像度が遅くなってから遅くなるまで、天井の面倒な部分が現在の黒または正しい効果ではなく、互いに混ざり合っていることがわかります。

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

+0

良い診断の提案。私は現在GL_LINEAR_MIPMAP_NEARESTを使用しています。 – brainjam

+0

あなたの提案が私の問題解決に役立った。ミップマップの生成は実際には非同期的に見えます。 – brainjam

+0

Appleに報告してください。これは私の仕様書の読者ごとのバグです。あなたが直接メールを送る相手を探しているならば、Allan Schafferは頭のOpenGLの人です。 – Tommy

1

私は@ Tommyの提案に従い、GL_LINEAR_MIPMAP_LINEARに切り替えました。これで、黒または正の効果が、正しいものと黒の間のフェードに変わりました。

私はOpenGLがパイプラインであることを知っていますが、状態や明示的な同期を取っていなければ非同期であることを知っていますが、私たちはそれを忘れる傾向があります。この場合、私が描いていなかったのは確かでしたが、テクスチャをロードして設定しました。

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

+0

あなたのソリューションをフォローアップしていただき、ありがとうございます。私は2,3ヶ月間、同様の奇妙な結果で同様の問題を抱えてきました。ミップマップを生成した後にglFinish()を追加することで、すべての問題を解決しました。男、最終的にそれが解決されたのはどんな救済ですか! –

+0

OSX 10.10.5で同じ問題が発生しています!それだけでなく、単純なglTexSubImage2Dも非同期で、glFlush()/ glFinish()が必要です。それ以外の場合はアーティファクトがあります。 – user362515

3

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

+0

確かに、その手掛かりは問題を説明しています。 'glGenerateMipMaps'は、他のGL呼び出しと同様に、次のGL操作が行われる前に完了することが保証されています.OpenGLはスレッドセーフではなく、単一のコンテキストを複数のスレッドで同時に使用することはできません。 – Tommy

関連する問題