缓冲区对象

        今天在做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)使用适当的顶点数组渲染函数进行渲染。

      

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值