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保存结束


示例:

开始保存状态

(1, &vaoHandle);

(vaoHandle);

    

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

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

(positionAttribHandle);

    // Send data to shader using queried attrib location

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

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

    

(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

(colorAttribHandle);

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

    

保存结束

(0);


渲染时使用VAO渲染

    // Bind our Vertex Array Object

(vaoHandle);

(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);