私のコードは正常に動作していますが、偶然かもしれません。後でバグについて詳しく説明したくないので、できるだけきれいに保つようにしています。
メッシュを初期化するために次のことを行います。
- VBO とバッファ データの生成とバインド
- IBOおよびバッファデータの生成とバインド
- VAO の生成とバインド
- 1で生成された、前と同じVBOをバインドします。
- 必要な頂点属性配列を有効にし、頂点属性ポインターを設定します
- IBOを再度バインドします(理由は正確にはわかりません)
- 作成したばかりの VAO を台無しにしないように、BindVertexArray を 0 に戻します。
私の理解では、VAO は有効にした頂点属性配列の状態を保存します。また、バインドした VBO と IBO の両方も保存されます。Vertex Array を 0 にバインドして VAO のすべてのアクションを「閉じた」ため、他のコードが私の VAO を台無しにすることはありません。これで問題がなければ、レンダリングする必要があるのは次のとおりです。
- バインドVAO
- 要素を描く
- VAO のバインドを解除 (0 にバインド)
これにより、AttribArray の状態と、保存されている VBO および IBO の両方が表示されます。私の質問は次のとおりです。
A. VertexAttribPointers を設定した後、IBO をバインドする必要がありますか? もしそうなら、なぜですか?
B. VAO は本当にVBOとIBO の両方を保存しますか? バインドされた最後のバッファーのみを保存すると聞いたことがあります。つまり、次のようにレンダリングする必要があります。
- バインドVAO
- VBO をバインド
- 要素を描く
- VAO のバインドを解除
しかし、これは意味がありません。両方のバッファ オブジェクトを格納しないのに、なぜ VAO を使用するのでしょうか? VBO と IBO をバインドしてから、VAO をバインドせずに要素を描画するのと同じではありませんか?
助けてくれてありがとう。
コードは次のとおりです。
初期化
// generate VBO
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, m_vertices.size()*sizeof(GLfloat), m_vertices.data(), GL_STATIC_DRAW);
// generate IBO
glGenBuffers(1, &m_ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size()*sizeof(unsigned short), m_indices.data(), GL_STATIC_DRAW);
// generate VAO
glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
// set the vertex attribute pointer
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,vertexSize,reinterpret_cast<const GLvoid*>(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBindVertexArray(0);
描く
glBindVertexArray(m_vao);
glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,reinterpret_cast<const GLvoid*>(0));
glBindVertexArray(0);
また、次のようにするとすっきりしませんか。
- VAO の生成とバインド
- IBO と BufferData の生成とバインド
- VBO と BufferData を生成してバインドする
- 私が必要とし、VertexAttribPointers を設定する EnableVertexAttribArrays
- VAO のバインドを解除 (0 にバインド)
よりきれいに見えますが、特にステップ 4 と 5 の間に IBO バインディングがないため、結果が同じかどうかはわかりません。