凡人の日々の経過を記録
カレンダー
カテゴリー
リンク
最新記事
(03/21)
(03/11)
(03/05)
(03/02)
(02/06)
ブログ内検索
コガネモチ
OpenGL関係のWikiページを整理した。
名前変更が主。 整理した理由は分かりづらかったから。 よそのページもそうなんだが、OpenGLのバージョンいくつに対応しているかがはっきりしないことがよくある。 分かる人が見えればわかるかもしれないが、初めての人はとっつきにくい。 書籍の多くはいまだにOpenGL1.xのglVertexを羅列したり、リストを使ったりする記述が多く見られるが、最近ではそんな記述は古く、オブジェクトバッファを使うのが当たり前だろう。 また、OpenGL4.xではOpenGL1.xで使われていたAPIがかなりなくなっているからなおさら混乱する. このあたりの区別はわかりやすく書くべきだろうと、実際OpenGLを触ってみた感じたことである. ということで、1.x,2.x,3.x,4.xというページ区分で作ってみた. それで今までGLSLで作っていたのを3.xにした。 2.xと4.xはまだ用意できていないが、そのうち作れればと思う. ただ、4.xに対応するグラフィックボードはまだ導入できていないので、作成は当分おあずけかも. 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を使わない実装方法なんかもはやりこの本がないと始まらない。 もっとこういった本が出てほしいな。 もっとプログラミングに興味がある一般素人でも入りやすい環境がほしい。 とりあえずボヤいてみたりした。 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間のバス占有率が下がるということで高速化が期待できる?! 根拠に自信ないけど。。
Powered by 忍者ブログ
Design by © まめの
Copyright © [ ずくのない凡人の日記 ] All Rights Reserved. http://bambooflow.blog.shinobi.jp/ |