web-dev-qa-db-ja.com

頂点配列オブジェクトについて(glGenVertexArrays)

頂点配列オブジェクト(VAO)を次のように生成/作成するポイントと混同しています。

_glGenVertexArrays(GLsizei n, GLuint *arrays);
_

そして

_glBindVertexArray(GLuint);
_

頂点など、バッファオブジェクトを作成し、VAOを作成せずにglVertexAttribPointerおよびglEnableVertexAttribArrayでそのバッファオブジェクトを説明できるためです。

私の質問は、バッファオブジェクト内のデータを記述するために実際にVAOを作成する必要がない場合、OpenGL SuperBible 5edなどのソースにVBOの作成時にVAOを作成するための呼び出しが含まれるのはなぜですか?それらは私がまだ発見していないより高度なトピックにのみ使用されていますか、私は完全に混乱していますか?

また、VBOでウィキペディアのエントリを読んでいるときにこの質問に最初に遭遇しました。サンプルコードにはglGenVertexArrays()の呼び出しは含まれていませんが、データはglVertexAttribPointer()Wiki VBOエントリ - VAOがどのような理由で作成される例?

32
bluth

パフォーマンスの改善。

多くの場合、ホストで属性を設定するには、多数のAPI呼び出しと、実装内での重要な量の検証が必要です。

これらすべてを一度実行し、VAOを使用すると、その作業を償却できます。

実際のデータについては、たとえば、Graham Sellersの analysis を参照してください。

21
Bahbar

3つのVBO(シェーディング用の異なるデータ、おそらく位置、法線、およびいくつかの派手な効果パラメータ)を必要とするオブジェクトを構築しているとします。このオブジェクトを描画するたびに、これらすべてのVBOをバインドし、追加のパラメーターを設定する必要があります。 VAOを使用する場合は、1回の呼び出し(頂点配列のバインド)を使用するだけで済みます。これにより、特定のオブジェクトの環境全体がセットアップされます。

16
Orka

答えはあなたが想像したほど難しくはありません。それを面白い比喩と考えてください。 VertexArrayObjectは上司であり、VetexBufferObjectsである複数のスタッフを管理します。

6
ShannonLiu