2010年10月22日金曜日

レンダーターゲット切り替え

FBOを使っていて,レンダリング先の切り替えを考えたときに複数の方法が思い浮かぶ.
レンダーターゲット切り替えについてnvidiaの人が語っていて,その部分抜粋したのが以下


Next Generation Rendering with OpenGL

When using multiple rendering destinations, there are several ways to switch between them.

  1. Using multiple FBOs, with a separate FBO for each texture, switching between them using glBindFramebufferEXT(). This is the most straightforward approach, and it is at least twice as fast as having to switch contexts.
  2. Using a single FBO with multiple texture attachments. This requires that the textures have the same format and dimensions. Textures can be switched between using glFramebufferTexture(). This is slightly more lightweight than using multiple FBOs, so it may be faster.
  3. Using a single FBO with multiple texture attachments and attaching the textures to different color attachments. glDrawBuffer() is used to switch between the attachments. 

と、いうことで、レンダ先テクスチャが全て同じフォーマットであれば、使うFBOは一つにして、それに関連付けるテクスチャをglFramebufferTexture()で切り替えることでレンダーターゲットの切り替えとすることだそうです.

2010年10月20日水曜日

FBOとPBO

今までいまいち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使っとけということか。