「ピクセルデータ」を貯めておく「バッファオブジェクト」が「PixelBufferObject(PBO)」を呼ばれる。
「PBO」は「
VertexBufferObject」のAPIを使っているが、そこに「PBO」用の「トークン」を指定する。
これによって、「メモリマネージャ(OpenGLのDriver)」が「shared memory」か「ビデオメモリ」がよいか判断する。
また、「PBO」がどのように使われるかも指定する。
- GL_PIXEL_PACK_BUFFER_ARB → 「ピクセルデータ」を「PBO」に転送する時に使う
- GL_PIXEL_UNPACK_BUFFER_ARB → 「PBO」から「ピクセルデータ」に転送する時に使う。
▲PBOにおける「PACK」「UNPACK」の概念図
これは、OpenGLの関数でいうと
- 「glReadPixels()」や「glGetTexImage()」 → 「PACK」の処理
- 「glDrawPixels()」や「glTexImage2D()」、「glTexSubImage2D()」 → 「UNPACK」の処理
となる。
以下はglReadPixelsを用いた時の動作例。
[例1]
- 「GL_PIXEL_PACK_BUFFER_ARB」 を指定
- glReadPixels()を実行する
⇒OpenGLのフレームバッファから読み込んで、PBOにデータを格納する
[例2]
- 「GL_PIXEL_UNPACK_BUFFER_ARB」を指定
- glReadPixels()を実行する
⇒PBOからデータを読み込んで、OpenGLのフレームバッファにコピーする