假如我们要绘制两个共边的三角形,实际上涉及的顶点是4个,然而如果我们用VBO和VAO来绘制,就必须输入6组数据,因为不允许重复使用。这样就造成了浪费。
为了解决这个问题,我们引入EBO索引缓冲对象(Element Buffer Object)。
- 我们要输入顶点数据和索引
float vertices[] = {
0.5f, 0.5f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
unsigned int indices[] = { // 注意索引从0开始!
0, 1, 3, // 第一个三角形
1, 2, 3 // 第二个三角形
};
- 创建EBO
unsigned int EBO;
glGenBuffers(1, &EBO);
- 绑定EBO并把数据输入
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
注意绑定顺序为VAO,VBO,EBO,不能乱
- 渲染绘制
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
当使用EBO进行绘制时使用的是glDrawElements函数,第一个参数指定了我们绘制的模式,这个和glDrawArrays的一样。第二个参数是我们打算绘制顶点的个数,这里填6,也就是说我们一共需要绘制6个顶点。第三个参数是索引的类型,这里是GL_UNSIGNED_INT。最后一个参数里我们可以指定EBO中的偏移量。
注意,EBO实际上对应了VAO的,因为索引中的数字指的是某个顶点,VBO是一串数据,没有区分顶点,VAO才划分了顶点,所以,除了最后的绘制,其余部分VAO参与必不可少。