前面的顶点数组使得几何图元的显示方便了很多,但是如果每次都要向OPENGL发送一大块数据,而这数据其实并没有修改过,那么这传输就是冗余的。所以这里添加了缓冲区对象,将顶点数组存储在服务器端的缓冲区对象中。
1. 创建缓冲区对象
glGenBuffers(GLsizei n,GLuint *buffers) 任何非零的无符合整数都可以作为缓冲区对象的标识符使用。这个函数的作用就是向系统申请n个缓冲区,系统把这n个缓冲区的标识符都放进buffers数组中。还可以调用glIsBuffer()函数判断一个标识符是否正被使用。
2. 激活缓冲区对象
为了激活缓冲区对象,首先需要将它绑定。glBindBuffer(GLenum target, GLuint buffer)。target用于决定绑定的是顶点数据还是索引,关于这个函数的解释,书上第二章讲的很详细了。
3. 用数据分配和初始化缓冲区对象
glBufferData()用于在OPENGL服务器中分配内存建立缓冲区,并将客户机的内存复制到这个缓冲区对象。
4. 更新缓冲区对象的数值
当程序中的顶点坐标、颜色等数据发生了修改之后,需要修改对应的缓冲区数值。这里有两种方法可以完成此功能。
glBufferSubData():直接用提供的数据替换绑定的缓冲区的数据子集。
第二种方法更灵活些:
首先用glMapBuffer()返回一个缓冲区指针,然后通过指针和下标对缓冲区对象做修改,最后调用glUnmapBuffer()取消对缓冲区的映射。
5. 清除缓冲区对象
glDeleteBuffers(GLsizei n,GLuint *buffers),完成了对缓冲区对象的操作之后,可以释放它的资源。
当使用缓冲区对象存储顶点数组数据时,应在应用程序中增加几个步骤:
- 生成缓冲区对象标识符(可选)。
- 绑定缓冲区对象,确定它是用于存储顶点数据还是索引。
- 请求数据的存储空间,并对这些数据元素进行初始化,下一个步骤可选。
- 指定相对于缓冲区起始位置的偏移量,对诸如glVertexPointer()这样的顶点数组进行初始化。
- 绑定适当的缓冲区对象,以用于渲染。
- 使用适当的顶点数组渲染函数进行渲染,如glDrawArrays()或glDrawElements()等。
流程图如下:
over~
本文原创,转载请注明出处: