在某些場合需要快速的將Video Frame stream到GPU texture, 比如要使用GPU渲染從相機過來的幀數據。這時候候就能夠將數據直接寫入pixel unpack buffer object.
OpenGL 支持幾種buffer objects, 其中用的最多的大概就是vertex buffer object (VBO) 用來存儲頂點相干數據。 創建和綁定buffer object的函數:
void glGenBuffers(GLsizei n, GLuint *buffers);
void glBindBuffer(GLenum target, GLuint buffer);
target
: 可以是以下任1個, 在綁定buffer object以后,下1步就是分配GPU存儲空間了:
void glBufferData(GLenum target, GLsizeiptr size,const void *data, GLenum usage);
size
: 緩存大小,單位 bytedata
: 用來初始化緩存的原始數據指針,當為NULL時,緩存不會被初始化,但是空間已分配。分配好空間的buffer object 可使用以下函數更新緩存:
void glBufferSubData(GLenum target, GLintptr offset,GLsizeiptr size, const void *data);
我們知道當target
為GL_ARRAY_BUFFER時,我們稱這個buffer object 為Vertex Buffer Object(VBO), 本文重點要論述的則是GL_PIXEL_UNPACK_BUFFER對應于Pixel Buffer Object(PBO),我們在向texture上傳/填充數據的時候數據來源可以直接位于GPU中.
PBO作為buffer object, 我們可以通過memory map的方式直接得到PBO的指針:
void* glMapBufferRange(GLenum target,
GLintptr offset,
GLsizeiptr length,
GLbitfield access);
target
: GL_PIXEL_UNPACK_BUFFERoffset
: offset in bytes into the buffer data storelength
: number of bytes of the buffer data to mapaccess
: a bitfield combination of access flags函數所返回的指針可以用來更新PBO的內容。當更新終了以后我們需要調用相應的unmap函數唆使數據更新已完成并釋放指針。
GLboolean glUnmapBuffer(GLenum target);
調用texture填充函數更新texture像素信息:
glTexImage*,
glTexSubImage*,
glCompressedTexImage*,
glCompressedTexSubImage*
當GL_PIXEL_UNPACK_BUFFER綁定有效的PBO時,這些函數都直接從PBO獲得數據源,而不用從系統內存上傳數據到GPU. 由于數據已位于GPU,這些函數會立即返回,因此使用這類方式更新texture數據非常高效,固然條件條件是性能非常重要或內存使用有限制的情況下才應當斟酌這類方法!
最后總結1下:
上一篇 pjlib線程實現簡析