頂点配列を使用する場合とVBOを使用する場合


14

私は頂点配列頂点バッファオブジェクトについて学ぼうとしていますが、次の点で違いがわかりません:

  • 使用例(地形などの静的ジオメトリ、パーティクルシステムのようなすべてのフレームを変更するジオメトリなど)
  • 性能
  • 移植性(古いグラフィックカード、コンソール、AndroidやiPhoneなどのデバイスなど)

いくつかの明確化?


3
ここに到着した他の誰のために、...ほとんどのアップはここに答えを投票してチェックstackoverflow.com/questions/430555/...
afuzzyllama

回答:


14

ここに 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)にジオメトリデータを保存する唯一の方法です。


2
そのPerformanceTuning.pdfでは、VBOは「最適でない場合にパフォーマンスを損なう可能性がある」と述べていますが、詳細は説明していません。それらのケースが何であるか考えていますか?フレームごとにジオメトリを更新する必要がある場合があるため、その場合、頂点配列がVBOよりも良いか悪いかを疑問に思っています。THX。
sidewinderguy

1
opengl.org/sdk/docs/man/xhtml/glDrawElements.xmlおよびopengl.org/wiki/GlDrawElementsをお読みください -頂点配列は非推奨または削除されていません。それらはOpenGL 4.x以降も引き続きサポートされています。何を拡散していることがちょうど誤報であるので、ストレートメイトをあなたの事実を得る

1
@vaxquisクライアント側の頂点配列は非推奨です。サーバー側の頂点配列はそうではありません。VAOは別のものであり、状態を保存するためのものです。投稿には何も問題はありませんでしたが、クライアント側を明記すればより正確になる可能性があります。しかし、それは暗黙的だったと思います。
concept3d 14年

1
「クライアント側の頂点配列は非推奨です。サーバー側の頂点配列は非推奨です。」「頂点配列は、3.0より前のOpenGLで使用可能、3.0で非推奨、3.1 +で廃止されました。」「頂点の個別の配列(...)を事前に指定し、それを使用してglDrawElementsを1回呼び出すだけでプリミティブのシーケンスを構築できます。バージョン4.4のコア」-これらのステートメントに矛盾があります。

2
さらに、「廃止予定」と言う前に、できれば公式文書でそのような声明の出典を明記してください。証拠としてStackExchangeからStackOverflowを指すことは科学の仕組みではなく、「暗黙的だったと思います」で防御することは議論ではありません。クライアント/サーバーアレイについては誰も質問しませんでした。VBOと比較して、最も広い意味での頂点アレイについての質問でした。ところで、私はVAOについて何も言っていませんが、そのアイデアはどこから来たのですか?

11

(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+ を行う必要があるという追加の責任から解放されません。レンダリングするためだけに必要なのは、完全に静的なデータがある場合のみです。glBufferDataglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)


+1 VAOはひどくわかりにくい名前であり、混乱したopenGLが何になったかを常に思い出させます。
concept3d 14

1
また、この質問に関する議論に参加したことを覚えています(ほとんど削除されました)。繰り返しますが、問題はOpenGLの恐ろしい用語にあります。また、Chrisの回答をより正確に編集しました。
concept3d 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.