VBOを掘り下げる。

就活が頓挫するなか、現実逃避の為にプログラミングでもしようぜ。

ちなみに、今日はプログラムに色をつけるはてな記法をマスターしてしまったので、もっと見やすくなるよ。うへへ。今のところの目標としては、ポリゴンデータを読み取ってVBOに格納、それを表示させる、というところ。以下、自分の考察を書いているだけなので、あまり本気にしないでください。内容があっている保証はしません。

VBOのおまじないを徹底的に調べてみよう。

関係ありそうな関数をぬきとってみる。(引数は全く無視。ここでは各関数の役割とデータの流れを感覚的につかむことが目的。)

// 準備の段階で必要な関数
glGenBuffers();
"Object Buffer Name" を作り出す。OBNのデータ型はunsigned integer

glBindBuffer();


glBufferData();


glMapBuffer();



// 描く段階で必要な関数
glEnableClientState();


glBindBuffer();


glVertexPointer();
レンダリングに使用される頂点配列のデータ型や位置を指定する。

glNormalPointer();
レンダリングに使用される法線配列のデータ型や位置を指定する。

glDrawElements();


glDisableClientState();


 まず、何がよくわからなかったかというと、glBindBuffer();は何と何を結びつけているんだ!というお話でして。Bindというからには何かと何かをくっつけているわけです。

 結論から言うと、「target と buffer object name をくっつけている。」

 はて、それでは "Target" と "Buffer object name" とはいったいなんなんだろう。これがまたよく分からないのです。"Target"にはGL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER の四つがあり、Buffer object nameはglGenBuffer();で作る、ということは分かった。

 で、Google先生は教えてくれました。

http://www.spec.org/gwpg/gpc.static/vbo_whitepaper.html

 このページに非常にくわしくVBOのことがのってる。まず、VBOはOpenGL target object(つまりTarget)とともに作用?するようになってる。つまり、こいつらがTargetであり、データを保存するバッファです。これらのバッファはメモリ上にあると考えていいのかな?(GPU上でなく。)

  • Array Buffer(ARRAY_BUFFER) … 頂点座標や法線の情報を保存するバッファ。
  • Element Array Buffer(ELEMENT_ARRAY_BUFFER) … 各エレメントのインデックスを保存しておくバッファ。

 そして、Buffer object nameって言ってるのがとてもわかりにくい。だって、日本語にしたらバッファオブジェクト名。”名”が何を意味してるのかよく分からない。実際は「ID」として考えるといいかも。

 流れとしては、Array Buffer(Targetのこと)の中に頂点座標や法線の情報をぶち込みたい。どうするか。まず、頂点座標や法線が格納されるバッファ区域にIDをつける。そのIDを作るのがglGenBuffer();。実際のバッファ区域とIDを関連付けするのがglBindBuffer();かな。たぶんメモリ確保とかはOpenGLが勝手にやってくれるみたい。

 全然まとまってないけど、今日はこのぐらいにしよう。