VAO VBO EBO(2)

本篇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);

 

posted @ 2019-09-15 16:29  jckcoenf  阅读(293)  评论(0编辑  收藏  举报