OpenGL缓冲对象:glGetBufferParameteriv、glGetBufferSubData、glGetBufferPointerv简介

  1. OpenGL缓冲对象概念
  2. 缓冲区对象 Buffer Objects API列表

  1. 缓冲区对象 Buffer Objects
  2. 创建和绑定缓冲区对象 Creating and Binding Buffer Objects
  3. 创建缓冲对象数据存储 Creating Buffer Object Data Stores
  4. 修改缓冲对象数据存储 Modifying Buffer Object Data Stores
  5. Clear缓冲对象数据存储 Clear Buffer Object Data Stores
  6. 映射映射缓冲数据 Mapping Buffer Data
  7. 刷新映射缓冲数据 Flush Buffer Data
  8. 取消映射缓冲数据 Unmapping Buffer Data
  9. 使缓冲区数据无效 Invalidating Buffer Data
  10. 缓冲区间复制 Copying Between Buffers
  11. 缓冲对象查询 Buffer Object Queries

查询缓冲区对象信息和数据

查询缓冲对象的相关信息

void glGetBufferParameteriv( enum target, enum pname,int *data );
void glGetBufferParameteri64v( enum target, enum pname,int64 *data );
void glGetNamedBufferParameteriv( uint buffer,enum pname, int *data );
void glGetNamedBufferParameteri64v( uint buffer,enum pname, int64 *data );

GetBufferParameter*GetNamedBufferParameter* 函数用于查询缓冲对象的相关信息。它们的区别在于,前者通过目标(target)绑定的缓冲对象来获取信息,后者则直接通过缓冲对象的名字(buffer)来指定。

  • glGetBufferParameterivglGetBufferParameteri64v 返回整数类型或64位整数类型的参数值。
  • glGetNamedBufferParameterivglGetNamedBufferParameteri64v 也分别返回整数类型或64位整数类型的参数值。

这些函数中,pname 参数必须是表中列出的缓冲对象参数之一,除了 BUFFER_MAP_POINTER。数据将被存储在 data 指向的内存区域中。

Name Type Initial Value Legal Values
BUFFER_SIZE int64 0 any non-negative integer
BUFFER_USAGE enum STATIC_DRAW STREAM_DRAW, STREAM_READ, STREAM_COPY, STATIC_DRAW, STATIC_READ, STATIC_COPY, DYNAMIC_DRAW, DYNAMIC_READ, DYNAMIC_COPY
BUFFER_ACCESS enum READ_WRITE READ_ONLY, WRITE_ONLY, READ_WRITE
BUFFER_ACCESS_FLAGS int 0 See section 6.3
BUFFER_IMMUTABLE_STORAGE boolean FALSE TRUE, FALSE
BUFFER_MAPPED boolean FALSE TRUE, FALSE
BUFFER_MAP_POINTER void* NULL address
BUFFER_MAP_OFFSET int64 0 any non-negative integer
BUFFER_MAP_LENGTH int64 0 any non-negative integer
BUFFER_STORAGE_FLAGS int 0 See section 6.2

Table : Buffer object parameters and their values.

查询缓冲对象的数据存储内容

void glGetBufferSubData( enum target, intptr offset,sizeiptr size, void *data );
void glGetNamedBufferSubData( uint buffer, intptr offset,sizeiptr size, void *data );

对于查询缓冲对象的数据存储内容,可以使用 glGetBufferSubDataglGetNamedBufferSubData 函数:

  • glGetBufferSubData 根据绑定的目标和偏移量从缓冲对象中读取一部分数据到客户端内存。
  • glGetNamedBufferSubData 则根据指定缓冲对象的名字、偏移量和大小从缓冲对象中读取数据。
void glGetBufferPointerv( enum target, enum pname, const void **params );
void glGetNamedBufferPointerv( uint buffer, enum pname,const void **params );

获取映射范围内的指针

最后,当缓冲对象的部分或全部数据存储区被映射时,可以通过 glGetBufferPointervglGetNamedBufferPointerv 获取映射范围内的指针:

  • glGetBufferPointervglGetNamedBufferPointerv 分别通过目标绑定和缓冲对象名字来获取当前映射区域的指针。

    • pname 必须为 BUFFER_MAP_POINTER
    • 如果缓冲对象的数据存储区未被映射,或者请求上下文没有映射该缓冲区,并且实现不支持多客户端映射,则返回 NULL 指针值。

你可能感兴趣的:(OpenGL,图形渲染)