本篇blog讲的是VAO,想看VBO参照上一篇blog。
VAO(vertex array object,顶点数组对象),不得不说......这个名字起得真是鬼畜,名字和功能八竿子打不着。
吐槽归吐槽,该写还是要写的。
我们知道,VBO保存了一个模型的顶点属性信息,每次绘制模型之前我们需要绑定所有的这些信息,对于单个模型来说,这个操作本身无可厚非,但是,当绘制量很大且有大量重复的时候,这样的操作就会变得很麻烦。为了解决这个问题,引入了VAO。VAO可以把所有的配置以及绘制操作都存储在一个对象中,当需要绘制重复的图形的时候,就可以直接把VAO拿出来。(VAO保存了很多的属性(0-15共16个),可以说一个VAO囊括了多个VBO)。
//generate unsigned int vaoID; glGenVertexArrays(1, &vaoID); //bind glBindVertexArray(vaoID);
执行了VAO绑定之后,其后所有绑定的VBO配置都会是VAO对象的一部分。
下面给出完整的操作代码
// ..:: 初始化代码(只运行一次 (除非你的物体频繁改变)) :: .. // 1. 绑定VAO glBindVertexArray(vaoID); // 2. 把顶点数组复制到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, vboID); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 3. 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); [...] // ..:: 绘制代码(渲染循环中) :: .. // 4. 绘制物体 glUseProgram(shaderProgram); glBindVertexArray(vaoID); someOpenGLFunctionThatDrawsOurTriangle();
这样子就搞定了,重复物体用一个VAO,多个物体用多个VAO。(至于说一个VAO绑定多个VBO,那些VBO都是针对一个物体的属性集)
PS:需要注意的一个点,使用完了一个VAO对象之后,为了安全性保证,要解绑VAO对象,如下:
glBindVertexArray(0);