加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

直接Stream Video到GPU Texture 内存

发布时间:2020-12-13 20:47:31 所属栏目:PHP教程 来源:网络整理
导读:在某些场合需要快速的将Video Frame stream到GPU texture,比如要使用GPU渲染从相机过来的帧数据。这时候候就能够将数据直接写入pixel unpack buffer object. Pixel unpack buffer object OpenGL 支持几种buffer objects,其中用的最多的大概就是vertex buffer

在某些场合需要快速的将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,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,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 数据

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读