回答:
頂点配列オブジェクトの命名は、やや不幸です。アプリケーションの中/と一緒に表示される(使用される)ものが3つあり、名前に「配列」または「バッファー」が付いている(歴史的に)名前が異なる(まあ、フレームバッファーオブジェクトもあります)しかし、私はそれを無視します)。
頂点配列オブジェクト(VAO)は、1つ以上の頂点バッファーオブジェクトを含むオブジェクトであり、レンダリングされたオブジェクト全体の情報を格納するように設計されています。
(khronosから引き出された)
各バッファーは、頂点配列(オブジェクト)の1つの属性を構成する傾向があります。VAOには、多くの頂点属性(位置、色、UVなど)を含めることができます。それぞれが独自のバッファーに保持される場合があります。バッファーは、フォーマットされていない一連の連続したバイトを示し、CPU側のOpenGL呼び出しとGPU側のシェーダー作業の両方で、バッファー要素ごとにサイズ(タイプ)を明示的に指定する必要があります。
それが一つの方法です。これが機能する他の方法は次のとおりです。
次の図は、後者の2つのケースを示しています。
結論:OpenGLで「頂点配列」という語句が非修飾で使用されている場合、それはVAOを意味すると想定できます。VAOは、OpenGLコンテキストでは(具体的には)バッファとはまったく異なるものです。
コメントを編集:GL_ARRAY_BUFFER
上記のように、頂点属性データにそのバッファオブジェクトを使用する意図を示します。これは、バッファが頂点属性のみに使用されないためです。ただし、これは最も一般的なユースケースであり、VAOについて質問しているため、他のものには触れません。ただし、ここに設定可能な他のタイプのバッファのリストがあります。
struct
型のいずれかになります。データは、バッファごとにインターリーブされるか、完全に均一になる場合があります。CPUの従来のC配列と同様に、それらにインデックスを付けることができます。配列オブジェクト(この正しい用語を使用するか、自分自身を混乱させることになります!)...(以下に続く)
この用語は、OpenGLの歴史に根ざしています。ここで重要なGLバージョンのほとんどについて、OpenGLは段階的に進化し、APIを変更するのではなく、既存のAPIに新しい機能を追加することで覚えておくことが重要です。
OpenGLの最初のバージョンには、これらのオブジェクトタイプはありませんでした。描画は、複数のglBegin / glEnd呼び出しを発行することで達成されましたが、このモデルの問題の1つは、関数呼び出しのオーバーヘッドの点で非常に効率が悪いことでした。
OpenGL 1.1は、頂点配列を導入することでこれに対処するための最初のステップを踏みました。頂点データを直接指定する代わりに、C / C ++配列からソースを取得できるようになりました-したがって、その名前です。したがって、頂点配列はまさにそれです-頂点の配列とそれらを指定するのに必要なGL状態。
次の大きな進化はGL 1.5によってもたらされ、頂点配列データをシステム(「クライアント側」)メモリではなくGPUメモリに保存できるようになりました。GL 1.1頂点配列仕様の弱点は、使用するたびに頂点データの完全なセットをGPUに転送する必要があることでした。GPU上に既に存在する場合、この転送は回避され、潜在的なパフォーマンスの向上が達成されます。
そのため、GPUにこのデータを保存できる新しいタイプのGLオブジェクトが作成されました。テクスチャオブジェクトがテクスチャデータの格納に使用されるように、頂点バッファオブジェクトは頂点データを格納します。これは、実際には、より一般的なバッファオブジェクトタイプの特殊なケースであり、非特定のデータを格納する場合があります。
頂点バッファーオブジェクトを使用するためのAPIは、既存の頂点配列APIに便乗しているため、バイトオフセットをポインターに変換するなどの奇妙なことがわかります。そのため、状態を保存するだけの頂点配列APIがあり、データはメモリ内配列ではなくバッファオブジェクトから取得されます。
これは私たちの物語の終わりにほとんど私たちをもたらします。結果のAPIは頂点配列状態を指定する際に非常に冗長であったため、最適化の別の手段は、この状態をすべて収集し、1回のAPI呼び出しで複数の頂点配列状態の変更を許可し、GPUを許可する新しいオブジェクトタイプを作成することでした事前にどの状態が使用されるかを知ることができるため、潜在的に最適化を実行します。
このすべてを一緒に収集する頂点配列オブジェクトを入力します。
要約すると、頂点配列は、描画のための状態とデータ(配列に格納されている)のコレクションとして始まりました。頂点バッファは残し、GLオブジェクトタイプのメモリ内のアレイ・ストレージを置き換える頂点配列だけの状態であることを。頂点配列オブジェクトは、それがより容易に変更し、より少ないAPI呼び出しとすることができるように、この状態のためだけコンテナオブジェクトです。
私はしばらくの間OpenGLで働いたことがないので、私は半分しか正しくないかもしれません。一般的に言って、バッファはフォーマットされていないメモリの配列を格納します。配列は、連続したメモリの一般的な用語です。
バッファはコンテキストにバインドする必要がありますが、配列は単なるデータの配列です。正しくリコールする場合、バッファ内のデータはグラフィックスカードにコピーされることを意味します(したがって、バインディング)。
これが少し役立つことを願って
char* buffer = socketRead();
(擬似コード)と同じくらい簡単です。一方、ログはアプリのライフサイクル全体を通じて有効です。したがって、どこかで配列を作成し、ソケットの読み取りを開始します。データを取得するたびに、そのチャンクを配列に書き込み、受け取ったすべてのデータの適切なリストを提供します。