对我来说,这是两个非常容易忘的概念,细节也不太好记忆。所以我简单粗暴地总结一下二者。可能未必精确,但get到了大致思想即可。
VBO:Vertex Buffer Object,顶点缓冲对象。
可以存储大量顶点,因而我们可以利用VBO一次性发送一大批数据到显卡上。
VAO:Vertex Array Object,顶点数组对象。
一个VAO,配置并告诉了我们该如何使用VBO(包括如何解读VBO中的数据),以及使用哪个VBO。
为了了解VAO究竟存了什么,我执行了一个小测试。
a test about VAO
我把绑定VAO的那句代码:glBindVertexArray(cubeVAO)
分别放在了三个位置。
Position 1: 绑定并配置VBO之前。
Position 2: 绑定并配置VBO之后,配置顶点属性之前。
Position 3: 配置顶点属性之后。
如下图所示:
运行结果如下:Position1与Position2都正常,且没有任何区别;Position3不正常(显而易见:))
据我分析,Position1与Position2之所以运行结果相同,源于OpenGL的状态机模式。Position1自然不必多说,走的是正常流程。Position2的话,由于我们已经先行绑定了VBO,在状态机模式下,当我们开始绑定VAO的时候,此时的VBO尚未被解绑,所以相当于VAO在绑定和配置过程中,隐含地包含了一个绑定中的VBO。
网友评论