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

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



前に、GLUT+GLEWで作ったものを、Qtに実装してみた。

特に問題なくいった。
GLUTよりも拡張性が高いので、たとえばウィンドウのフレームバーにFPSを表示させることも簡単にできた。


拍手[0回]

PR


OpenGLのプラットフォームをいろいろ調べたところ、あまりみつからなかった。

現状、環境がかなり限定されてしまうことになるが、
 Qt4.7 + gl3w(OpenGL3.x core profile)
とすることに決めた。




拍手[0回]



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に対応するグラフィックボードはまだ導入できていないので、作成は当分おあずけかも.


拍手[0回]



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を使わない実装方法なんかもはやりこの本がないと始まらない。
もっとこういった本が出てほしいな。
もっとプログラミングに興味がある一般素人でも入りやすい環境がほしい。

とりあえずボヤいてみたりした。


拍手[0回]




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回]




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