OpenGL 缓冲区对象
今天学习了一下缓冲区对象.....
OpenGL是按照客户机-服务器模式设计的,在OpenGL需要数据的时候,都必须把数据从客户机内传输到服务器。
缓冲区对象,允许应用程序现实的指定把哪些数据存储在图形服务器。
1.创建缓冲区对象
glGenBuffers():OpenGL分配n个当前未使用的名称(非 0),表示缓冲区对象。
原型 : void glGenBuffers(GLsizei n,GLuint *buffers);
GLboolean glIsBuffer(GLuint buffer):判断一个标识符是否是当前使用的缓冲区对象的标识符。
2.激活缓冲区对象
激活缓冲区对象,首先需要对他进行绑定。绑定缓冲区对象表示选择未来的操作将影响到哪个缓冲区 对象。
glBindBuffer(GLenum target ,GLuint buffer): 指定了当前的活动缓冲区对象 。
3.用数据分配和初始化缓冲区对象
一旦绑定了一个缓冲区对象,就需要保留空间以存储数据。
void glBufferData(GLenum target,GLsizeiptr size,const GLvoid * data,GLenum usage );
功能是分配size个存储单位的OpenGL服务器内存,用于存储顶点数据或索引。以前有与当前缓冲区对象相关联的数据将删除。
glBufferData()首先在OpenGL拂去其中分配内存以存储数据。如果成功分配,data!=NULL,size个单位就会从客户机内存复制到这个对象中。如果data=NULL,为数据保留适当的空间,但不会初始化。
在缓冲区对象中可以进行三种操作:绘图 读取 复制。
4.更新缓冲区对象的数据值
方法一:假设已经在用用程序的一个缓冲区中准备了相同类型的数据,glBufferSubData()将用我们提供的数据替换被绑定的缓冲区对象的一些数据子集。
void glBufferSubData(GLenum target,GLuint offset,GLsizei size,const GLvoid *data); 用data 指向的数据更新 与target 相关联的当前绑定缓冲区对象中从offset开始的size个字节数据。
方法二:允许灵活的选择需要更新的数据。
GLvoid *glMapBuffer(GLenum target,GLuenum access):返回一个指向缓冲区对象的指针,可以在这个缓冲区对象中写入新值及更新之后,再调用GLboolean glUnMapBuffer(GLenum target)表示已经完成了对数据的更新,取消对这个缓冲区的映射。如果只需要更新所需范围内的数据值,也可调用GLvoid *glMapBuffwerRange(GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access)
5.在缓冲区对象之间复制数据
void glCopyBufferSubData(readbuffer,writebuffer,resdoffset,writeoffset,size);
把数据从与readbuffer相关联的缓冲区对象复制到绑定到writebuffer的缓冲区对象。
6. 清除缓冲区对象
glDeleteBuffer(GLsizei n,const GLuint *buffers):删除n个缓冲区对象。被删除的当前缓冲区对象的所有绑定都重置为零。如果一个缓冲区对象是在绑定时删除的,这个对象的所有绑定都重置为默认的缓冲区对象。
7.使用缓冲区对象来存储顶点数组数据
需要以下步骤:
(1)生成缓冲区对象标识符;
(2)绑定缓冲区对象,确定是存储顶点数据还是索引;
(3)请求数据的存储空间,并对数据元素进行初始化;
(4)指定相对于缓冲区起始位置的偏移量;
(5)绑定适当的缓冲区对象,用于渲染;
(6)使用适当的顶点数组渲染函数进行渲染,比如glDrawArrays()
如果想初始化多个缓冲区对象,就需要为每个缓冲区对象重复以上。顶点数组数据的所有格式都适用于缓冲区对象。