凡人の日々の経過を記録
カレンダー
カテゴリー
リンク
最新記事
(03/21)
(03/11)
(03/05)
(03/02)
(02/06)
ブログ内検索
コガネモチ
VBOとVAOって名前が似ている。 似ているんだけど違いがいまいち分からなかった。 でも、今日ようやく理解できたのでメモしておく。
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を使った場合、レンダリング時の処理は、
の2つだけになる。
レンダリング時の記述が簡潔になるということは、CPU<->GPU間のバス占有率が下がるということで高速化が期待できる?! 根拠に自信ないけど。。 PR |