凡人の日々の経過を記録
カレンダー
カテゴリー
リンク
最新記事
(03/21)
(03/11)
(03/05)
(03/02)
(02/06)
ブログ内検索
コガネモチ
2011年になった。
今年はどんな年になるだろう。 さて、OpenGLを去年の12月から再び始めることにした。何もすることもなくただただ時間を無駄にするよりかはるかによいので。 で、始めたはいいが、はやりOpenGLはハードルが高い。 仕事もまったく関係していないので情報源はおもにWebと参考書しかなく四苦八苦している。 とくにOpenGL3.x, 4.xとなると情報量がガクンと減ってしまう。 新しいということもあるが、せめて3.xには対応した参考書とかもう少し増えてほしいとおもう。 そんな中でも、比較的お世話になっているのが、 「OpenGL ES 2.0 プログラミングガイド」 である。 この本はOpenGL ES本なのだが、3.x, 4.xに通じるところがあり、特にGLSLを使った内容がとても参考になる。また、4.xで削除されたAPIを使わない実装方法なんかもはやりこの本がないと始まらない。 もっとこういった本が出てほしいな。 もっとプログラミングに興味がある一般素人でも入りやすい環境がほしい。 とりあえずボヤいてみたりした。 PR 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間のバス占有率が下がるということで高速化が期待できる?! 根拠に自信ないけど。。 OSはUbuntu10.04
gxext.hの最新を入れる。 % wget http://www.opengl.org/registry/api/glxext.h % sudo mv glxext.h /usr/include/GL % git clone git://glfw.git.sourceforge.net/gitroot/glfw/glfw % cd glfw % cmake . % make % sudo make install /usr/localにインストールされる。 /usr/localなので動的ライブラリは別途指定が必要とおもわれ、 % sudo vi /etc/ld.so.conf.d/local <= 新規作成 ----- /usr/local/lib ----- % sudo ldconfig
Powered by 忍者ブログ
Design by © まめの
Copyright © [ ずくのない凡人の日記 ] All Rights Reserved. http://bambooflow.blog.shinobi.jp/ |