What are Vertex Array Objects? Ask Question

What are Vertex Array Objects? Ask Question

I am just starting to learn OpenGL today from this tutorial: http://openglbook.com/the-book/
I got to chapter 2, where I draw a triangle, and I understand everything except VAOs (is this acronym OK?). The tutorial has this code:

glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);

While I understand that the code is necessary, I have no clue what it does. Although I never use VaoId past this point (except to destroy it), the code does not function without it. I am assuming this is because it is required to be bound, but I don't know why. Does this exact code just need to be part of every OpenGL program? The tutorial explains VAOs as:

A Vertex Array Object (or VAO) is an object that describes how the vertex attributes are stored in a Vertex Buffer Object (or VBO). This means that the VAO is not the actual object storing the vertex data, but the descriptor of the vertex data. Vertex attributes can be described by the glVertexAttribPointer function and its two sister functions glVertexAttribIPointer and glVertexAttribLPointer, the first of which we’ll explore below.

VAO が頂点属性をどのように記述するのか理解できません。私はそれらをまったく記述していません。glVertexAttribPointer から情報を取得しているのでしょうか? これが原因だと思います。VAO は単に glVertexAttribPointer からの情報の宛先なのでしょうか?

ちなみに、私が従っているチュートリアルは適切でしょうか? 何か注意すべき点や、従うべきより良いチュートリアルはありますか?

ベストアンサー1

「頂点配列オブジェクト」は、Silly Names の OpenGL ARB 小委員会によって提供されています。

これをジオメトリ オブジェクトとして考えてください。(昔の SGI Performer プログラマーとして、私はこれをジオセットと呼んでいます。) オブジェクトのインスタンス変数/メンバーは、頂点ポインター、法線ポインター、カラー ポインター、属性 N ポインターなどです。

VAOが最初にバインドされるとき、これらのメンバーを呼び出し割り当てます。

glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer...;
glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer...;

有効になっている属性と指定したポインタは VAO に保存されます。

その後、VAO を再度バインドすると、それらの属性とポインターもすべて最新になります。したがって、1 回のglBindVertexArray呼び出しは、すべての属性を設定するために以前に必要だったすべてのコードと同等になります。これは、独自の構造体やオブジェクトを作成しなくても、関数やメソッド間でジオメトリを渡すのに便利です。

(VAO を使用する最も簡単な方法は、一度セットアップして複数回使用することですが、バインドしてさらに enable/pointer 呼び出しを実行するだけで属性を変更することもできます。VAO は定数ではありません。)

パトリックの質問に対する詳細情報:

新しく作成された VAO のデフォルトは空です (AFAIK)。ジオメトリはまったくなく、頂点さえもないので、描画しようとすると OpenGL エラーが発生します。これは、「すべてを False/NULL/ゼロに初期化する」という意味で、かなり理にかなっています。

glEnableClientState設定時にのみ必要です。VAO は各ポインタの有効/無効状態を記憶します。

はい、VAO はglEnableVertexAttribArrayと を格納しますglVertexAttrib。古い頂点、法線、色、... 配列は属性配列と同じで、頂点 == #0 などです。

おすすめ記事