今までいまいちFBOとPBOの違いがよくわからなかった。
動作が違うのはなんとか理解したが、やれることが結構被ってるような気がしていた。
しかしここ
http://hacksoflife.blogspot.com/2006/10/vbos-pbos-and-fbos.html
にとても良くそれらの違いがまとめてあったので自分なりの言葉でまとめてみる。
つまり…
PBO :
今までglReadPixels()やglDrawPixels()、glTexImage2d()などで行ってきた、フレームバッファやテクスチャに、データを送ったり持って来たりしていた操作の、より効率的な方法を提供するもの。
- OpenGLドライバが格納データを管理する。
- データをフレームバッファから読み込んだりをOpenGLが非同期に実行する
- VBOと同じような動き
- 単純にglReadPixels()するよりは早くなる。
持ってきたデータをテクスチャとして使いたいときは、結局テクスチャオブジェクトにコピーしなけばならないので下で説明するFBOを使ったほうが良い。
フレームバッファからデータを読み込む動作が非同期で行われるのを最大限活用するためには、一度読み込みコマンドを実行したら、しばらくPBOには触れずに違う処理をしているのが良いらしい。
間を置かずにのPBOへ何かしら命令すると、先程の読み込みが終わるまで待たなければいけないから。
FBO:
フレームバッファ無視して、直接テクスチャにレンダリングできる。デプス値とかも書き込める 。
- ので、環境マッピングとかにはPBOより効率的
- しかし古いグラフィックボードでは使えない。PBOは使える
こんなところでしょうか。本当にざっと読んだだけなので少し間違ってるところもあるかも。
まとめると、FBO使っとけということか。