2011-07-06 15 views
10

いくつかのメッシュ(時には500以上)をレンダリングしており、これにアプローチする最善の方法を知りたかったのです。 500個のVBOを作成するのは無意味でしょうか?そして、それらが錐台と可視性テストに合格すれば、それらをレンダリングします。これを行うより効率的な方法はありますか?私はパフォーマンスを最大限にしようとしています。OpenGL - 複数のVBOを使用して描画をスローダウンしますか?

答えて

11

あなたの質問に答えるには、多くのVBOが問題を緩和します。より多くのポリスは通常レンダリングを遅くしますが、描画呼び出しが増えるほどヒット率は高くなります。状態の変化や描画を最小限に抑えたいだけでなく、バ​​ッファ数(メモリ使用量)も必要です。

まず、バッファーを調べて、どれくらい多くのものがあるのか​​を考えてください。にはが必要です。バッチ/インスタンスジオメトリを使用できる場合は、スタティックジオメトリを単一のバッファにマージし、バッファをより効率的に再利用してください。

バッファを最小限に抑えたら、複数のソート。俯瞰(おそらくオクトリー)とオクルージョンの両方による可視性は、大幅なパフォーマンス向上をもたらす可能性があります。主なアイデアは、ジオメトリをできるだけ早く簡単に無効にすることです。そのため、大まかなテスト(オクトリー)から少し詳細(おそらくAABBおよび/または単純化されたハル)から開始し、次にオクルージョンを実際に描画します。

ここには、四分の一(および、拡張、オクト)のビットに触れるgood article on frustrum cullingがあります。ダイアグラム、説明、サンプルコード。

OpenGLオクルージョンカリング記事は、あまり一般的ではないようですが、this one from GPU Gemsは良いスタート地点かもしれません。

+1

返信いただきありがとうございます。私は、バイナリツリーを使って錐台の淘汰をしており、うまくいきます。私はちょうど500バッファを持つことは、VBOに関連するスピード・ゲインの本質を全面的に打破するという事実に心配していました。 –

+1

これは間違っているわけではありません:いくつかのVBOを使うとGPUは別のものをアップロードしながらGPUを描画し、GPUメモリとメインメモリ間でデータを移動できるので、運転者がしなければならないこともある)は、データを更新するように、より効率的になります。ちょうど、peachykeenが指摘したように、そのうちの数百を持つことは、何百回も状態を変えることを意味し、最終的には有害である。 – Damon

+2

ええ、VBOは良いです(回避する方法があればフレームごとにジオメトリを送るべきではありません)が、バッファが多すぎるとメモリ不足エラーが発生し、パフォーマンスが著しく低下する可能性があります。私は500が*多すぎるかどうかはわかりませんが、それをカットして見ても十分かもしれません。 – ssube

関連する問題