忍者ブログ
凡人の日々の経過を記録
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。




VBOとVAOって名前が似ている。
似ているんだけど違いがいまいち分からなかった。
でも、今日ようやく理解できたのでメモしておく。
  • VBO:Vertex Buffer Object
  • VAO: Vertex Array Object
VBOは、サーバ側メモリに領域を確保して頂点座標配列、法線配列、テクスチャ座標配列、などを保持するために使用する。
VAOは、VBOをカプセル化するもので、VertexAttribPointer、EnableVertexAttribArrayといった制御もVAOに格納することができる。
VAOを使った場合、VBOのみ使用のときに比べてレンダリングするときの制御が簡潔になるのが利点。

----
GLuint vao[1];
GLuint vbo[2];
vertex_t verticies[] = { /* pos(x,y,z) , normal(x,y,z), coord(s, t) ... */ };
GLuint indices[] = {  ... };

///--- setup ----------

    // Create VBO
    glGenBuffers(2, vbo);
 
    // Create and bind VAO
    glGenVertexArrays(1, vao);
    glBindVertexArray(vao[0]);
    {   
      // --- VBO 0 ---
      glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
      glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);
 
      offset = 0;
      glVertexAttribPointer(context->positionLocation,
              3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offset);
      offset += 3 * sizeof(GLfloat);
      glVertexAttribPointer(context->normalLocation,
              3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offset);
      offset += 3 * sizeof(GLfloat);
      glVertexAttribPointer(context->texcoord0Location,
              2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (const void*)offset);
 
      glEnableVertexAttribArray(context->positionLocation);
      glEnableVertexAttribArray(context->normalLocation);
      glEnableVertexAttribArray(context->texcoord0Location);
 
      // --- VBO 1 ---
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
      glBufferData(GL_ELEMENT_ARRAY_BUFFER, numOfIndecies*sizeof(GLuint), indices, GL_STATIC_DRAW);
    }
    glBindVertexArray(0);
 
    glDeleteBuffers(2, vbo);

///--- render ----------

    // VAO - vertex, normal, texcoord0
    glBindVertexArray(vao[0]);
    glDrawElements(GL_TRIANGLES, numOfIndecies, GL_UNSIGNED_INT, 0);
 
---

上記から分かるとおり、VAOを使った場合、レンダリング時の処理は、
  • BindVertexArray
  • glDrawElements
の2つだけになる。
レンダリング時の記述が簡潔になるということは、CPU<->GPU間のバス占有率が下がるということで高速化が期待できる?!
根拠に自信ないけど。。

 

拍手[0回]

PR


この記事にコメントする
HN:
TITLE:
COLOR:
MAIL:
URL:
COMMENT:
PASS:
無題
glDeleteBuffers(2, vbo);
で消していますが、VAOに登録後は不要になるからでしょうか?
NONAME 2011/11/17(Thu) 22:59 *edit
この記事へのトラックバック
この記事にトラックバックする:

Powered by 忍者ブログ  Design by © まめの
Copyright © [ ずくのない凡人の日記 ] All Rights Reserved.
http://bambooflow.blog.shinobi.jp/