1、两者的定义
VAO,即Vertext Array Object,从名称上看就能理解,这是一个数组对象,这个数组对象里包含了一个或多个VBO(Vertext Buffer Object). 它主要的作用就是用来存储渲染一个完整对象的信息,比如渲染一个对象所需的颜色、几何坐标信息等。
VBO,即Vertext Buffer Object,其本质就是一个内存Buffer, 存储在GPU里,内存读写速度快,主要作用是存储坐标,向量,texture坐标等。
2、基于代码理解
/* 定义一个VAO */
glGenVertexArrays(1, &vao);
/*绑定其作为当前使用的对象 */
glBindVertexArray(vao);
/*定义两个VBO */
glGenBuffers(2, vbo);
/*绑定第0个VBO作为当前active的对象,后面用来存储坐标信息 */
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
/* 从CPU里复制数据到位于GPU的VBO里 */
/* 8 * sizeof(GLfloat) 是Buffer的大小 */
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), data, GL_STATIC_DRAW);
/*在这里建立VAO和VBO的联系,即VAO里的第0个与当前的VBO绑定,并定义每个坐标由两个数构成 */
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
/*将其Enable以便其可用 */
glEnableVertexAttribArray(0);
/* 绑定第1个VBO作为当前active的对象,后面用来存储颜色信息 */
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
/* 从CPU里复制数据到位于GPU的VBO里 */
/* 12 * sizeof(GLfloat)是Buffer的大小 */
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
/* 在这里建立VAO和VBO的联系,即VAO里的第0个与当前的VBO绑定,并定义每个颜色由三个数构成 */
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
/* 将其Enable以便其可用 */
glEnableVertexAttribArray(1);
/* -------省略定义Shader的代码----------------*/
/* 将shaderprograme里用到的变量和VBO 通过index绑定*/
glBindAttribLocation(shaderprogram, 0, "in_Position");
glBindAttribLocation(shaderprogram, 1, "in_Color");