OpenGL :glBindBuffer参数详解
1.函数原型
- void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
glBufferData
创建用于当前绑定到缓冲对象的新数据存储目标。将删除任何预先存在的数据存储。新的数据存储与指定的创建大小以字节为单位和使用。如果数据不是NULL,数据存储进行初始化,从这个指针数据。第一次绑定后的缓冲区对象的状态是未映射的零大小的内存缓冲区,具有GL_READ_WRITE
访问权限和GL_STATIC_DRAW
用法。
2. 参数解释
2.1 target
target,指定目标缓冲区对象:
可选参数 | 解释 |
---|---|
GL_ARRAY_BUFFER | 可以用来保存glVertexAttribPointer()设置的顶点数组数据 |
GL_ATOMIC_COUNTER_BUFFER | 同样,可以使用GL_UNIFORM_BUFFER,GL_ATOMIC_COUNTER_BUFFER和GL_SHADER_STORAGE_BUFFER缓冲区绑定点,但不分别直接影响统一缓冲区,原子计数器缓冲区或着色器存储缓冲区状态。必须使用glBindBufferBase或glBindBufferRange将缓冲区绑定到索引的统一缓冲区,原子计数器缓冲区或着色器存储缓冲区绑定点 |
GL_COPY_READ_BUFFER GL_COPY_WRITE_BUFFER | 这两个目标是一对互相匹配的结合点,用于拷贝缓存之间的数据,并且不会引起OpenGL的状态变化,也不会产生任何特殊形式的OPenGL调用,允许使用glCopyBufferSubData而不会干扰其他绑定的状态。但是,glCopyBufferSubData可以与任何一对缓冲区绑定点一起使用 |
GL_DRAW_INDIRECT_BUFFER | 通过glDrawArraysIndirect和glDrawElementsIndirect发出的绘制参数来自该缓冲区对象的数据存储中的指定偏移量 |
GL_DISPATCH_INDIRECT_BUFFER | 当非零缓冲区对象绑定到GL_DISPATCH_INDIRECT_BUFFER目标时,通过glDispatchComputeIndirect发出的计算调度的参数来自该缓冲区对象的数据存储中的指定偏移量 |
GL_ELEMENT_ARRAY_BUFFER | 当非零缓冲区对象绑定到GL_ELEMENT_ARRAY_BUFFER目标时,glDrawElements,glDrawElementsInstanced,glDrawElementsBaseVertex,glDrawRangeElements,glDrawRangeElementsBaseVertex,glMultiDrawElements或glMultiDrawElementsBaseVertex的indices参数被解释为在基本机器单元中测量的缓冲区对象内的偏移量 |
GL_PIXEL_PACK_BUFFER | 这一缓存目标用于从图象对象中读取数据,例如纹理和帧缓存数据,相关OPenGL命令包括glGetTexImage()和glReadPixels()等。以下命令会受到影响:glGetCompressedTexImage,glGetTexImage和glReadPixels。指针参数被解释为在基本机器单元中测量的缓冲区对象内的偏移量 |
GL_PIXEL_UNPACK_BUFFER | 这一缓存目标与GL_PLXEL_PACK_BUFFER正好相反,它可以作为glTexImage2D()等命令的数据源使用,下面的命令会受到影响:glCompressedTexImage1D,glCompressedTexImage2D,glCompressedTexImage3D,glCompressedTexSubImage1D,glCompressedTexSubImage2D,glCompressedTexSubImage3D,glTexImage1D,glTexImage2D,glTexImage3D,glTexSubImage1D,glTexSubImage2D,和glTexSubImage3D。指针参数被解释为在基本机器单元中测量的缓冲区对象内的偏移量 |
GL_QUERY_BUFFER | 所述GL_QUERY_BUFFER结合点被用于指定一个缓冲器对象,它是通过调用所述接收查询对象的结果glGetQueryObject家族命令 |
GL_SHADER_STORAGE_BUFFER | 同样,可以使用GL_UNIFORM_BUFFER,GL_ATOMIC_COUNTER_BUFFER和GL_SHADER_STORAGE_BUFFER缓冲区绑定点,但不分别直接影响统一缓冲区,原子计数器缓冲区或着色器存储缓冲区状态。必须使用glBindBufferBase或glBindBufferRange将缓冲区绑定到索引的统一缓冲区,原子计数器缓冲区或着色器存储缓冲区绑定点 |
GL_TEXTURE_BUFFER | 纹理缓存也就是直接绑定到纹理对象的缓存,这样就可以直接在着色器中读取他们的信息,GL_TEXTURE_BUFFER可以提供一个操控此类缓存的目标,但还需要将缓存关联到纹理,才能确保能够使用,glGenTextures仍然用于创建纹理对象。并且 glBindTexture仍然用于绑定纹理。对于缓冲区纹理,纹理绑定到 GL_TEXTURE_BUFFER目标。为缓冲区对象创建存储是主要区别 |
GL_TRANSFORM_FEEDBACK_BUFFER | transform feedback是OpenGL提供的一种便捷方案,它可以在管线的顶点处理部分结束时,将经过变换的顶点重新捕获,并将部分属性写入到缓存对象中,通常在几何着色器中使用较多,该GL_TRANSFORM_FEEDBACK_BUFFER缓冲结合点可以传递给glBindBuffer,但不会直接影响变换的反馈状态。相反,必须通过调用glBindBufferBase或glBindBufferRange来使用索引的GL_TRANSFORM_FEEDBACK_BUFFER绑定。这将影响通用GL_TRANSFORM_FEEDBACK_BUFFER绑定 |
GL_UNIFORM_BUFFER | 这个目标可以用于创建uniform缓存对象的缓存数据,但直接影响统一存储缓冲区状态。必须使用glBindBufferBase或glBindBufferRange将缓冲区绑定到索引的统一缓冲区绑定点 |
2.2 size
size,指定缓冲区对象的新数据存储的大小(以字节为单位);
2.3 data
data,指定将复制到数据存储区以进行初始化的数据的指针,如果不复制数据,则指定NULL;
2.4 uasge
uasge,指定数据存储的预期使用模式:
可选参数 | 解释 |
---|---|
GL_STREAM_DRAW | 代码输入,用于绘制。设置一次,并且很少使用 |
GL_STREAM_READ | 接受OpenGL输出,用于绘制。设置一次,并且很少使用 |
GL_STREAM_COPY | 接受OpenGL输出,用于绘制或者用于拷贝至图片。设置一次,很少使用 |
GL_STATIC_DRAW | 代码输入,用于绘制或者拷贝至图片。设置一次,经常使用 |
GL_STATIC_READ | 接受OpenGL输出,用于绘制。设置一次,代码经常查询 |
GL_STATIC_COPY | 接受OpenGL输出,用于绘制或者用于拷贝至图片。设置一次,经常使用 |
GL_DYNAMIC_DRAW | 代码经常更新其内容,用于绘制或者用于拷贝至图片,使用频率高 |
GL_DYNAMIC_READ | OpenGL输出经常更新其内容,代码经常查询 |
GL_DYNAMIC_COPY | OpenGL输出经常更新其内容,用于绘制或者用于拷贝至图片,使用频率高 |
uasge是一个线索,GL实现作为一个缓冲区对象的数据存储将如何被访问。这使GL实现能够做出更明智的决策,这可能会显着影响缓冲区对象的性能。但是,它不会限制数据存储的实际使用。用法可以分解为两个部分:第一,访问频率(修改和使用),和第二,的访问权限的性质。
访问频率可能是以下之一:
STREAM
数据存储内容将被修改一次并最多使用几次。
STATIC
数据存储内容将被修改一次并多次使用。
DYNAMIC
数据存储内容将被重复修改并多次使用。
访问的性质可能是以下之一:
DRAW
数据存储内容由应用程序修改,并用作GL绘图和图像规范命令的源。
READ
通过从GL读取数据来修改数据存储内容,并在应用程序查询时用于返回该数据。
COPY
通过从GL读取数据来修改数据存储内容,并将其用作GL绘图和图像规范命令的源。
3.通过映射缓存对象输入数据
- void* glMapBuffer(GLenum target, GLenum access)
返回值:返回一个指向绑定到target的缓存对象的内存,如果失败则返回空
参 数:target 缓存绑定的目标
access 访问模式
- GLboolean glUmMapBuffer(GLenum target)
返回值:如果解除映射成功则返回GL_TRUE
参 数:target 缓存绑定的目标
意义
GL_READ_ONLY
对映射的内存进行只读操作
GL_WRITE_ONLY
对映射的内存进行只写操作
GL_READ_WRITE
对映射的内存进行读或写操作
4.输出数据
既然可以把数据写入缓存当然也能从缓存读取数据,可以使用函数glGetBufferSubData()从绑定的缓存中直接读取数据。也可以使用内存映射的方式读取,通过glBufferData()函数返回一个指向缓存的指针,再从中读取数据。
- void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data)
返回值:返回一个指向绑定到target的缓存对象的内存,如果失败则返回空
参 数:target 缓存绑定的目标
offset 首地址偏移量
size 回读数据的大小
data 传出参数,返回读到的数据
5.销毁
在完成对缓存数据的处理后,可以丢弃缓存数据了。要丢弃缓存对象的部分和全部数据,可以使用gllnvalidateBufferData()和gllnvalidateBufferSubData()
-
void gllnvalidateBufferData(GLuint buffer)
-
void gllnvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length)
返回值:void
参 数:buffer缓存对象
offset首地址偏移量
length丢弃数据的大小