18

VertexBufferVertexArrayVertexBufferObject、およびVertexArrayObjectの違いを誰かが説明したいと思いませんか?これらがすべて異なるものの用語であるかどうかさえわかりませんが、それらすべてがOpenGL仕様に表示されているのを見てきました。

VertexBufferには頂点が含まれているだけで、バインドされると他には何も含まれないことを知っています。頂点ポインターを設定すると、DrawArraysを使用して描画できます。私は何度もこのようにそれをしました。

私はVertexArrayであると思うものを使用しています。これは、設定されている頂点バッファーの状態と、頂点ポインターを格納します。VertexArrayをバインドすると、頂点バッファーが自動的にバインドされ、頂点ポインターが設定されます。私もこれを(ほとんど)うまく使っています。

しかし、VertexBufferObjectVertexArrayObjectとは何ですか?彼らは良いですか?VertexArrayは私に必要なすべてを提供しませんか?

4

2 に答える 2

18

頂点配列は、プログラム内の(アドレス空間内の)データであり、OpenGLへのポインターを提供することでOpenGLに通知します。
すべての頂点を個別に指定するよりも効率的ですが、それでもパフォーマンスの問題があります。GLは、DrawElements(または同様の関数)を呼び出すときにコピーを作成する必要があります。これは、データが有効であると確信できるのはそのときだけだからです(結局のところ、データをすぐに上書きすることを妨げるものは何もありません)。これは、並列処理に重大な障害があり、パフォーマンスの問題があることを意味します。

頂点バッファオブジェクト(「頂点バッファ」)は、所有していない、つまりアドレス空間にないデータの生のブロックです。Copy(Sub)Dataを使用してデータをバッファオブジェクトにコピーするか、一時的にアドレス空間にマッピングすることができます。バッファのマップを解除すると、そのバッファは自分のものではなくなります。大きな利点は、GLがそれをどう処理するか、いつアップロードするかを決定できることです。アクセスできないため、データが有効になることを認識しています。これにより、CPU/GPUの並列処理がはるかに簡単になります。

頂点配列のオブジェクトは少し誤称です。それらには頂点や配列はありません。これらは、1つまたは複数の頂点バッファオブジェクト(VertexAttribPointer呼び出しを含む)のバインディングをカプセル化する一種の「状態記述ブロック」にすぎません。そのため、これらは便利な関数であり、いくらか効率的です(関数呼び出しが少ない)が、厳密には必要ではありません。VAOが行うことはすべて手作業で行うこともできます。

于 2011-04-08T18:41:16.113 に答える
7
  • BufferObject:GPUに割り当てられたメモリバッファ
    • 頂点バッファオブジェクト:頂点情報(色、位置、シェーダーで使用されるカスタムデータなど)を含むBufferObject
    • ピクセルバッファオブジェクト:ピクセルまたはテクセル情報を含むBufferObject。主にテクスチャをアップロードするために使用されます。
    • 要素バッファオブジェクト:インデックスを含むBufferObject(glDrawElementsで使用)。
  • 頂点配列:gl*Pointer呼び出しで使用されるメモリ。glBindBufferコマンドを使用してバインドされている場合は、ホストメモリまたは頂点バッファオブジェクトである可能性がありGL_ARRAY_BUFFERます。
  • 要素配列:glDrawElements呼び出しで使用されるメモリ。glBindBufferコマンドを使用してバインドされている場合は、ホストメモリまたは要素バッファオブジェクトである可能性がありGL_ELEMENT_ARRAY_BUFFERます。
于 2011-04-08T18:45:42.293 に答える