今天在做CUDA的程序,突然出现了有关OpenGL缓冲区对象的函数,这让我很是纠结,因为我的OpenGL的基础不是很好,才接触不到一个月,今天我就稍微介绍一下缓冲区对象的有关函数。(参考OpenGL编程指南)
在许多OpenGL操作中,我们向OpenGL发送一大块数据,例如向它传递需要处理的顶点数据。传输这种数据可能非常简单,例如把数据从系统的内存中复制到图形卡。但是,由于OpenGL按照客户机-服务器模式而设计的,在OpenGL需要数据的任何时候,都必须把数据从客户机内存传输到服务器。如果数据并没有被修改,或者客户机和服务器位于不同的计算机(分布式渲染),数据的传输可能会比较缓慢,或者是冗余的。
操作的步骤如下:
1.创建缓冲区对象
任何非0的无符号整数都可以作为缓冲区对象的标识符使用。
为了让OpenGL分配缓冲区对象标识符,可以调用glGenBuffers()函数。
(1)void glGenBuffers(GLsizei n, GLuint* buffers);
函数功能:在buffers数组中返回n个当前未使用的名称,表示缓冲区对象。
参数:n表示要分配的缓冲区对象的个数;buffers用来保存缓冲区的对象标识符。
返回值:void。
(2)GLboolean glIsBuffer(GLunit buffer);
函数功能:判断一个标识符是否是一个当前被使用的缓冲区对象的标识符;
参数:buffer表示要判断的缓冲区对象标识符;
返回值:如果是一个已经被绑定的缓冲区对象的名称,而且还没被删除,就返回 GL_TRUE;否则,返回GL_FALSE。
2.激活缓冲区对象
为了要激活缓冲区对象,首先需要将它绑定。
void glBindBuffer(GLenum target, GLuint buffer);
函数功能:指定当前的活动缓冲区对象;
参数:target必须设置为GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY_BUFFER,buffer指定了将要绑定的缓冲区对象。
glBindBuffer()完成3个任务之一:(1).当buffer是个首次使用的非零无符号整数时,它就创建一个新的缓冲区对象,并把buffer分配给这个缓冲区对象,作为它的名称;(2). 当绑定到一个以前创建的缓冲区对象,这个缓冲区对象便成为活动的缓冲区对象;(3).当绑定到一个值为0的buffer时,OpenGL将会停止使用缓冲区对象。
3.用数据分配和初始化缓冲区对象
一旦绑定了一个缓冲区对象,就需要保存空间以存储数据。
void glBufferData(GLenum target, GLsizei size, const GLvoid* data, GLenum usage);
函数功能:分配size个存储单位的OpenGL服务器内存,用来存储顶点数据或索引。
参数:target可以是GL_ARRAY_BUFFER(表示顶点数据)、GL_ELEMENT_ARRAY_BUFFER(表示索引数据)、GL_PIXEL_UNPACK_BUFFER(表示传递给OpenGL的像素格式)或GL_PIXEL_PACK_BUFFER(表示从OpenGL获取数据的像素格式);size是存储相关数据所需要的内存数量;data可以是个指向客户机内存的指针,也可以是NULL,如果它所传的是个有效的指针,size个单位的存储空间就从客户机复制到服务器,如果它所传递的是NULL,这个函数将会保留size个单位的存储空间供以后使用,但不会初始化;usage提供了一个提示,就是数据在分配之后将如何进行读取和写入。
返回值:如果请求分配的内存数量超过了服务器能够分配的内存,就返回GL_OUT_OF_MEMORY。
4.清除缓冲区对象
完成了缓冲区对象的操作之后,我们就要释放它的资源。
void glDeleteBuffers(GLsizei n, const GLuint * buffers);
函数功能:删除n个缓冲区对象,它们的名称就是buffers数组的元素;
参数:n表示缓冲区个数,buffers表示要删除的缓冲区对象名称;
返回值为空。
5.使用缓冲区对象存储顶点数组数据
(1)生成缓冲区对象标识符;
(2)绑定一个缓冲区对象;
(3)请求数据的存储空间;
(4)指定相对应缓冲区起始位置的偏移量;
(5)绑定适当的缓冲区对象,以用于渲染;
(6)使用适当的顶点数组渲染函数进行渲染。