红宝书阅读笔记——缓冲区对象

前面的顶点数组使得几何图元的显示方便了很多,但是如果每次都要向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),完成了对缓冲区对象的操作之后,可以释放它的资源。

 

当使用缓冲区对象存储顶点数组数据时,应在应用程序中增加几个步骤:

  1. 生成缓冲区对象标识符(可选)。
  2. 绑定缓冲区对象,确定它是用于存储顶点数据还是索引。
  3. 请求数据的存储空间,并对这些数据元素进行初始化,下一个步骤可选。
  4. 指定相对于缓冲区起始位置的偏移量,对诸如glVertexPointer()这样的顶点数组进行初始化。
  5. 绑定适当的缓冲区对象,以用于渲染。
  6. 使用适当的顶点数组渲染函数进行渲染,如glDrawArrays()或glDrawElements()等。

流程图如下:

image

over~

本文原创,转载请注明出处:

http://blog.163.com/sara_athena/

http://www.cnblogs.com/luluathena/

posted @ 2010-08-23 18:42  筱夏  阅读(2639)  评论(0编辑  收藏  举报