您的位置:首页 > 编程语言 > VB

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

2017-09-07 11:08 841 查看
OpenGL中常用函数详解和VBO VAO详解以及VAO的使用

VBO将顶点信息放到GPU中,GPU在渲染时去缓存中取数据,二者中间的桥梁是GL-Context。GL-Context整个程序一般只有一个,所以如果一个渲染流程里有两份不同的绘制代码,GL-context就负责在他们之间进行切换。这也是为什么要在渲染过程中,在每份绘制代码之中会有glBindbuffer、glEnableVertexAttribArray、glVertexAttribPointer。那么优化的方法来了,把这些都放到初始化时候完成吧!VAO记录该次绘制所需要的所有VBO所需信息,把它保存到VAO特定位置,绘制的时候直接在这个位置取信息绘制。
VAO的全名是Vertex Array Object,首先,它不是Buffer-Object,所以不用作存储数据;其次,它针对“顶点”而言,也就是说它跟“顶点的绘制”息息相关
和 顶点数组没有任何关系 VAO保存的是VBO的绘制状态。VAO将其对应的VBO的状态及信息直接存储在GPU的内存中,VAO中并没有VBO的相关属性数据只是存储了VBO的当前状态及索引信息通过VAO就能快速访问到VBO的状态及VBO的数据(VAO和VA(Vertex
Array 顶点数组)没有任何关系)VAO记录的是一次绘制中所需要的信息,这包括“数据在哪里glBindBuffer”、“数据的格式是怎么样的glVertexAttribPointer”、shader-attribute的location的启用glEnableVertexAttribArray。VAO可以理解为一个状态容器,记录VBO的状态。
使用VAO后GPU在绘制时就可以直接找到其记录的VBO的状态及对应的VBO的数据能实现快速绘制并且避免了数据的频繁操作从而提高性能。

使用VBO的步骤就不做解释了。
此处解释使用VAO的步骤:
1.产生VAO
2.绑定VAO

3.绑定VBO对应的VBO handle(VBO
数据句柄)(Bind Vertex Buffer Object)
4.启用shader中对应的属性信息使用glEnableVertexAttribArray函数启用(shader-attribute的location的启用)
默认所有这些顶点属性端口都是关闭的,因此需要打开这些(CPU到GPU)通信端口
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐