描画の高速化3(VBOを使う)

toge氏の日誌(id:toge:20050420)を見て漏れ漏れもということで後回しにしていたARB_vertex_buffer_objectを試してみることに。
OpenGLではこういった拡張機能を使用する場合、使用できる拡張のリストを取得して目的の拡張が使えるのかどうかを調べ、必要な関数ポインタを取得してやる必要がある。
ところが何故かタイミングによってglGetString(GL_EXTENSIONS)がNULLを返してきてハマる・・・他のOpenGLAPIを呼んだ後で無いとだめぽ?ともかく解決したので気にしないことに。

なにはともあれチャキチャキと実装。使い方は通常の頂点配列とほとんど変わらない。

さっそく速度を計測してみる。全て独立3角形、テクスチャなし、スムースシェーディング。

  • 1万ポリゴンのモデル30個
    • VBO: 44FPS
    • 頂点配列: 16FPS
    • Vertex3fv: 8FPS
  • 1200ポリゴンのモデル160個
    • VBO: 59
    • 頂点配列: 30
    • Vertex3fv: 13
  • 12ポリゴンのローポリモデル約1600個でも試してみる。
    • VBO:56
    • 頂点配列:56
    • Vertex3fv: 57

1万ポリ以上の複雑なモデルでは、なんとVertex3fvの5倍以上、頂点配列の3倍近く高速という結果に。
うはwwwwwwwwwVBOテラ速スwwwwwww
ここまで劇的に速いともう普通の頂点配列にはもどれない。
それとは裏腹に、ローポリモデルではほとんど高速化の恩恵にあずかれなかった。っていうか微妙に逆転されている。(;´Д`)ナンデ!?
VBOの利点は、頂点情報などをあらかじめVGA上のメモリに格納しておくことで、毎フレーム頂点情報をメインメモリ→VGAと転送せずに済むこと(のはず)。
そもそもデータ量の少ないローポリモデルだと、相対的に内部処理のウエイトが大きくなって描画の高速化が生かされないんだろうか。

とにかく、ある程度複雑なモデルにはVBOを使うと幸せになれるようです。
こういう最適化とかの作業って楽しいんだけれど、のめりこんでしまうと肝心のゲーム製作がちっとも進まないという罠。まだまだ高速化の余地はあるしねえ。