2011-12-28 3 views
9

私はVertex Buffer Objectの使い方を理解しており、即時モードの描画よりも大幅にパフォーマンスが向上しています。私は2Dのクワッド(スプライト)をたくさん描画します。私はそれぞれのVBOを作成するか、すべてのデータを保持する1つのVBOを作成する必要があるかどうかを知りたいですか?いくつのVBOを使用しますか?

答えて

17

各スプライト/クワッドに新しいVBOを使用しないでください。したがって、それらをすべて単一のVBOに入れると、あなたの場合にはより良いソリューションになります。

しかし、一般的に私はこれが1つの文で答えることはできないと思います。

各Quadに新しいVBOを作成しても、実際のパフォーマンスが向上するわけではありません。そうすると、glBindBufferのVBOの切り替えが必要になり、多くの時間が無駄になります。しかし、あまりにも多くのデータを保持するVBOを作成すると、他の問題に遭遇する可能性があります。

小VBOs:

  • は、多くの場合、あなたのプログラムコードで扱いやすいです。レンダリングする各オブジェクトに新しいVBOを使用できます。この方法で、あなたのオブジェクトを非常に簡単にあなたの世界で管理することができます
  • VBOが小さすぎる(わずかな数の三角形)場合、大きな利益を得られません。

    • あなたは最高のパフォーマンスのための単一のdrawArrays()呼び出しでオブジェクトのトンをレンダリングすることができます多くの時間は、バッファ

    大VBOs間のバッファを切り替える(そしておそらくシェーダ/テクスチャを切り替え)で失われます。

  • 1つのVBOで多くのオブジェクトを管理するオーバーヘッドを作成する可能性があります(これらのオブジェクトの1つを移動して別のオブジェクトを回転させたい場合はどうすればよいでしょうか?)。
  • あなたVBOsは、彼らがVRAM

に移動することができないこと、その可能性は大きすぎる場合は、以下のリンクはあなたを助けることができます。

Vertex Specification Best Practices

1

ジオメトリのすべてまたはほとんどを保持するために、1つ(または少数の)のVBOを使用します。

一般的に、シーンをレンダリングするのに必要なAPI呼び出しが少なくなるほど良い結果が得られます。

1

それはまた、あなたがしたいdは何によって決まりますそれらのスプライトでやる?

動的ですか?あなたはクワッドの中心だけを変更したいのか、あるいは四つのポイントをすべて変更したいのですか?

これは重要です。これは、データが動的な場合、最も簡単な方法で、各フレームからCPUからGPUに転送する必要があるためです。たとえば、ジオメトリシェーダを使用するなど、GPUですべての計算を実行できますか?

非常に単純なクワッド/スプライトについても、GL_POINT_SPRITEを使用できます。これを使用すると、クワッド全体に対して1つの頂点のみを送信する必要があります。しかし、欠点は、それを回転させることが難しいことです...

関連する問題