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が勝手にやってくれるみたい。
全然まとまってないけど、今日はこのぐらいにしよう。