直接Stream Video到GPU Texture 内存

在某些场合需要快速的将Video Frame stream到GPU texture, 比如要使用GPU渲染从相机过来的帧数据。这时候候就能够将数据直接写入pixel unpack buffer object.


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个,
    • GL_ARRAY_BUFFER
    • GL_ELEMENT_ARRAY_BUFFER
    • GL_COPY_READ_BUFFER
    • GL_COPY_WRITE_BUFFER
    • GL_PIXEL_PACK_BUFFER
    • GL_PIXEL_UNPACK_BUFFER
    • GL_TRANSFORM_FEEDBACK_BUFFER
    • GL_UNIFORM_BUFFER

在绑定buffer object以后,下1步就是分配GPU存储空间了:

void glBufferData(GLenum target, GLsizeiptr size,const void *data, GLenum usage);
  • size: 缓存大小,单位 byte
  • data: 用来初始化缓存的原始数据指针,当为NULL时,缓存不会被初始化,但是空间已分配。

分配好空间的buffer object 可使用以下函数更新缓存:

void glBufferSubData(GLenum target, GLintptr offset,GLsizeiptr size, const void *data);

我们知道当targetGL_ARRAY_BUFFER时,我们称这个buffer object 为Vertex Buffer Object(VBO), 本文重点要论述的则是GL_PIXEL_UNPACK_BUFFER对应于Pixel Buffer Object(PBO),我们在向texture上传/填充数据的时候数据来源可以直接位于GPU中.


更新PBO缓冲区

PBO作为buffer object, 我们可以通过memory map的方式直接得到PBO的指针:

void* glMapBufferRange(GLenum target,
GLintptr offset,
GLsizeiptr length,
GLbitfield access);
  • target: GL_PIXEL_UNPACK_BUFFER
  • offset: offset in bytes into the buffer data store
  • length: number of bytes of the buffer data to map
  • access: a bitfield combination of access flags

函数所返回的指针可以用来更新PBO的内容。当更新终了以后我们需要调用相应的unmap函数唆使数据更新已完成并释放指针。

GLboolean glUnmapBuffer(GLenum target);

使用PBO缓存作为texture像素数据

调用texture填充函数更新texture像素信息:

glTexImage*,
glTexSubImage*,
glCompressedTexImage*,
glCompressedTexSubImage*

GL_PIXEL_UNPACK_BUFFER绑定有效的PBO时,这些函数都直接从PBO获得数据源,而不用从系统内存上传数据到GPU. 由于数据已位于GPU,这些函数会立即返回,因此使用这类方式更新texture数据非常高效,固然条件条件是性能非常重要或内存使用有限制的情况下才应当斟酌这类方法!


总结

最后总结1下:

  • 创建,绑定,分配PBO存储.
  • map PBO memory
  • update PBO memory
  • unmap PBO memory
  • 更新texture 数据
波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 直接Stream Video到GPU Texture 内存

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡