在不使用VAO仅使用VBO进行绘图比如绘制一个三角形的步骤是
- 绑定缓冲对象以拿到顶点数据
- 配置顶点属性指针以便OpenGL知道如何解析顶点数据
之后每次绘制一个三角形都要重复执行以上步骤,但是上面的步骤的配置都是相同的,不需要重复执行,VAO就是用来解决这个问题的。
使用VAO,只需要将配置函数执行一次,之后再绘制该物体的时候只需要绑定该VAO即可。
VAO的使用非常简单,需要在使用VBO等之前使用下面两条语句绑定即可
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
之后对VBO进行的操作都会保存在VAO中,在对VBO的操作完成了之后,可以解绑VAO,在需要再次使用的时候再次绑定。
代码示例
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
//把VBO绑定到顶点缓冲对象的缓冲类型GL_ARRAY_BUFFER上
//绑定完之后相当于把VBO对象绑定到了OpenGL状态机的上下文中
//接下来在GL_ARRAY_BUFFER上的所有操作都会改变VBO对象
glGenBuffers(1,&VBO);//生成VBO对象,同时用一个ID来唯一标识这个缓冲对象
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//把数据送到GPU
glBufferData(GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW);
//告诉OpenGL如何解析GPU缓存中的数据
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3* sizeof (float),(void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);