• 转:OpenGL 缓冲区对象


            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()
          如果想初始化多个缓冲区对象,就需要为每个缓冲区对象重复以上。顶点数组数据的所有格式都适用于缓冲区对象。

  • 相关阅读:
    Gym-101128D:Dice Cup
    C++内联汇编,输出人物名字
    钩子
    列表控件ListBox关联的MFC中的类:CListBox
    高级列表控件ListCtrl关联的MFC中的类:CListCtrl
    菜单复选及窗口置顶
    MFC学习之EDIT控件初始化
    dbgprint_Mine 调试输出
    64位内联汇编
    win7下提权代码
  • 原文地址:https://www.cnblogs.com/qwcbeyond/p/2573549.html
Copyright © 2020-2023  润新知