回答:
ここに VBOsについてまともな過去記事です。
性能
ここに呼び出しセマンティクスの概要を示します。
ここに、パフォーマンスの問題に関する別の優れた概要があります。その中で、VBOは配列よりもパフォーマンスが高いことがわかります。
VBOを好む理由は、データがカードにロードされるため、フレームごとにデータを転送する必要がないためです。作成されたVBOのタイプに応じて、グラフィックスドライバーに使用法のヒントを与えることができます(書き込み多、読み取り多対書き込み多、非読み取りなど)。
使用法
VBOは、変化しないと予想される地形やインスタンス化されたジオメトリなどの静的ジオメトリに非常に適しています。
頂点配列は、頻繁に変更されるデータにも適していますが、ホストマシンによって読み取られるため、操作されているデータ(たとえば、レーザーレンジファインダーデータバッファーは頻繁に使用されます)を直接レンダリングするために使用されます。ホストデバイス上のデータをまったく読み取らないで済む場合(つまり、データをカードにプッシュするだけ)、書き込み専用モードのVBOは適切なオプションです。
移植性
クライアント側の頂点配列 これらは、3.0より前のOpenGL、3.0で非推奨、3.1 +で廃止されました。OpenGL ESはそれらをサポートしています(OpenGL ES 2はサポートしていません)。
VBO これらはOpenGL 1.5以降で利用可能です。これらは、OpenGL ES 2(およびWebGL)にジオメトリデータを保存する唯一の方法です。
(ChrisEの答えは非常にあいまいであるため、ここに追加します。これは、残念ながら元の質問のあいまいさによるものです。ただし、OPの質問は「VAOを使用するタイミング」VBOを使用するタイミング」。
V ertex B uffer O bjects(他のタイプのB uffer O bjects、例えばU niform B uffer O bjects と実際に似ていない)は、頂点データをグラフィックスハードウェアにアップロードする手段を提供します。
Vの ertex Aの rrayのOの bjectsがに加えて使用されているVBO個々の頂点バッファおよび再集合の頂点を再バインドするために必要な呼び出しの数を減らすことで、クライアント側(CPU側)のパフォーマンスを向上させるためにsのあなたがするたびに属性特定の方法でレンダリングするように変更します。すべてのフレームで機能するすべてを行うのではなく、(初期化時に)1回実行してから、関連する頂点属性を使用する各(一連の)描画呼び出しに対して適切なVAOを再バインドします。
それにもかかわらず、VAOを使用しても、各フレームを変更するデータ(ゲームエンティティの位置/回転/変換行列など)に対してglBindBuffer
+ を行う必要があるという追加の責任から解放されません。レンダリングするためだけに必要なのは、完全に静的なデータがある場合のみです。glBufferData
glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)