OpenGL中常用函数详解和VBO VAO详解以及VAO的使用

OpenGL中常用函数详解和VBO VAO详解以及VAO的使用


VBO将顶点信息放到GPU中,GPU在渲染时去缓存中取数据,二者中间的桥梁是GL-ContextGL-Context整个程序一般只有一个,所以如果一个渲染流程里有两份不同的绘制代码,GL-context就负责在他们之间进行切换。这也是为什么要在渲染过程中,在每份绘制代码之中会有glBindbufferglEnableVertexAttribArrayglVertexAttribPointer。那么优化的方法来了,把这些都放到初始化时候完成吧!VAO记录该次绘制所需要的所有VBO所需信息,把它保存到VAO特定位置,绘制的时候直接在这个位置取信息绘制。

VAO的全名是Vertex Array Object,首先,它不是Buffer-Object,所以不用作存储数据;其次,它针对“顶点”而言,也就是说它跟“顶点的绘制”息息相关 顶点数组没有任何关系 VAO保存的是VBO的绘制状态。VAO将其对应的VBO的状态及信息直接存储在GPU的内存中,VAO中并没有VBO的相关属性数据只是存储了VBO的当前状态及索引信息通过VAO就能快速访问到VBO的状态及VBO的数据(VAOVA(Vertex Array 顶点数组)没有任何关系)VAO记录的是一次绘制中所需要的信息,这包括“数据在哪里glBindBuffer”、“数据的格式是怎么样的glVertexAttribPointer”、shader-attributelocation的启用glEnableVertexAttribArrayVAO可以理解为一个状态容器,记录VBO的状态。

使用VAOGPU在绘制时就可以直接找到其记录的VBO的状态及对应的VBO的数据能实现快速绘制并且避免了数据的频繁操作从而提高性能。


使用VBO的步骤就不做解释了。

此处解释使用VAO的步骤:

1.产生VAO

2.绑定VAO


3.绑定VBO对应的VBO handle(VBO 数据句柄)(Bind Vertex Buffer Object)

4.启用shader中对应的属性信息使用glEnableVertexAttribArray函数启用(shader-attributelocation的启用) 默认所有这些顶点属性端口都是关闭的,因此需要打开这些(CPUGPU)通信端口

5.指定了渲染时的顶点属性数组的数据格式和位置使用glVertexAttribPointer函数指定

6.绑定下一个VBO


7.VAO保存结束


示例:

    //开始保存状态

    glGenVertexArrays(1, &vaoHandle);

    glBindVertexArray(vaoHandle);

    

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);//绑定刚才分配的缓冲区到当前Context

    // Enable vertex position attribute GPU端,默认所有这些顶点属性端口都是关闭的,因此需要打开这些通信端口:

    glEnableVertexAttribArray(positionAttribHandle);

    // Send data to shader using queried attrib location

    //---指定了渲染时索引值为 positionAttribHandle 的顶点属性数组的数据格式和位置

    glVertexAttribPointer(positionAttribHandle, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);

    

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

    glEnableVertexAttribArray(colorAttribHandle);

    glVertexAttribPointer(colorAttribHandle, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *) (sizeof(float) * 3));

    

    //保存结束 // Disable our Vertex Buffer Object

    glBindVertexArray(0);


渲染时使用VAO渲染

    // Bind our Vertex Array Object

    glBindVertexArray(vaoHandle);  

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);


参考文章http://blog.csdn.net/jeffasd/article/details/77878739

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值