https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferData.xhtml
名称
glBufferData, glNamedBufferData ---- 创建与初始化缓存对象的储存数据。
原型
void glBufferData( GLenum target,
GLsizeiptr size,
const void * data,
GLenum usage);
void glNamedBufferData( GLuint buffer,
GLsizeiptr size,
const void *data,
GLenum usage);
参数
target
指定 glBufferData 绑定的缓存对象,绑定的 target 缓存类型必须是以下其中一中:
Buffer Binding Target | Purpose |
---|---|
GL_ARRAY_BUFFER | Vertex attributes |
GL_ATOMIC_COUNTER_BUFFER | Atomic counter storage |
GL_COPY_READ_BUFFER | Buffer copy source |
GL_COPY_WRITE_BUFFER | Buffer copy destination |
GL_DISPATCH_INDIRECT_BUFFER | Indirect compute dispatch commands |
GL_DRAW_INDIRECT_BUFFER | Indirect command arguments |
GL_ELEMENT_ARRAY_BUFFER | Vertex array indices |
GL_PIXEL_PACK_BUFFER | Pixel read target |
GL_PIXEL_UNPACK_BUFFER | Texture data source |
GL_QUERY_BUFFER | Query result buffer |
GL_SHADER_STORAGE_BUFFER | Read-write storage for shaders |
GL_TEXTURE_BUFFER | Texture data buffer |
GL_TRANSFORM_FEEDBACK_BUFFER | Transform feedback buffer |
GL_UNIFORM_BUFFER | Uniform block storage |
buffer
指定 glNamedBufferData 函数的缓存对象名称(指针)。
size
指定缓存对象的数据大小。
data
指定数据指针将复制数据用于初始化缓存数据的储存,或是 没有数据的话,将复制 NULL
。
usage
指定数据储存的使用模式。这个符号常量必须是 GL_STREAM_DRAW
, GL_STREAM_READ
, GL_STREAM_COPY
, GL_STATIC_DRAW
, GL_STATIC_READ
, GL_STATIC_COPY
, GL_DYNAMIC_DRAW
, GL_DYNAMIC_READ
, 或是 GL_DYNAMIC_COPY
.
描述
glBufferData 和 glNamedBufferData 都是给缓存对象创建新的数据。 glBufferData 的缓存对象是当前绑定到 target 中使用的。而 glNamedBufferData的话,缓存对象是个一个buffer的ID。
usage 给 GL 实现如何储存缓存对象的数据。可让 GL 实现智能决定缓存作用来提高显著的性能。
usage 可以分为两个功能控制:
- 第一,访问的频率(修改与使用的频率);
- 第二,访问数据的性质。
访问的频率有以下几个常量:
- STREAM
适合缓存数据修改一次并用于好几次。 - STATIC
适合缓存数据修改一次并用于多次。 - DYNAMIC
适合缓存数据修改多次并用于多次。
访问的性质有以下几个常量:
- DRAW
数据储存的内容由应用程序修改,并用于 GL 绘制与图像规范的命令。 - READ
数据储存的内容由GL读取来修改,并用于由应用程序查询返回的数据。 - COPY
数据储存的内容由GL读取来修改,并用于 GL 绘制与图像规范的命令。
注意
如果 data 数据为 NULL
,缓存对象还是会创建的,当它的内容是未初始化的。
GL_ATOMIC_COUNTER_BUFFER
仅用于 GL 版本为4.2或以上的。
GL_DISPATCH_INDIRECT_BUFFER
和 GL_SHADER_STORAGE_BUFFER
仅用于 GL 版本为4.3或以上的。
GL_QUERY_BUFFER
仅用于 GL 版本为4.4或以上的。
错误
如果 glBufferData 的 target 参数是无效的值,将生成 GL_INVALID_ENUM
错误。
如果 usage 不是GL_STREAM_DRAW
, GL_STREAM_READ
, GL_STREAM_COPY
, GL_STATIC_DRAW
, GL_STATIC_READ
, GL_STATIC_COPY
, GL_DYNAMIC_DRAW
, GL_DYNAMIC_READ
, 或是 GL_DYNAMIC_COPY
.,将生成 GL_INVALID_ENUM
错误。
如果 size 为负数,将生成 GL_INVALID_VALUE
错误。
如果 glBufferData 的缓存对象名称为0的绑定目标类型,将生成 GL_INVALID_OPERATION
错误。
如果 glNamedBufferData 的缓存对象名称与存在的一个缓存对象不同,将生成 GL_INVALID_OPERATION
错误。
如果 GL 不能创建指定 size 大小的数据存储,将生成 GL_OUT_OF_MEMORY
错误。