GLFW入门教程02.06:EBO

目的

在上一篇介绍了VAO和VBO,本文介绍EBO。

EBO

上一篇绘制三角形的时候是把三角形3个点传递至显卡VBO中,如果要绘制一个四边形呢?画两个三角形,而这两个三角形肯定有一条边两个点是重复的。这个时候就引入索引缓冲对象(Index Buffer Object,IBO)或者元素缓冲对象(Element Buffer Object,EBO)。

比如说一个四边形

1
2
3
4
5
6
float vertices[] = {
0.5f, 0.5f, 0.0f, // top right
0.5f, -0.5f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f // top left
};

四边形对应四个点,绘制两个三角形,如果一个模型包含几千几万个三角形呢?一个好的解决方案是,我们只存储4个顶点,然后指定绘制顺序,让GPU按照指定的顺序去绘制(索引绘制,Indexed Drawing)就可以了。

1
2
3
4
unsigned int indices[] = {  // note that we start from 0! 数组索引从0开始
0, 1, 3, // first Triangle
1, 2, 3 // second Triangle
};

代码

四边形

根据图像设计坐标顶点

1
2
3
4
5
6
float vertices[] = {
0.5f, 0.5f, 0.0f, // top right
0.5f, -0.5f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f // top left
};

用四个顶点画两个三角形。索引顺序为

1
2
3
4
unsigned int indices[] = {  // note that we start from 0! 数组索引从0开始
0, 1, 3, // first Triangle
1, 2, 3 // second Triangle
};

传递数据

1
2
3
4
5
6
7
8
9
10
glBindVertexArray(VAO);	//绑定顶点数组对象

glBindBuffer(GL_ARRAY_BUFFER, VBO); //绑定顶点缓冲对象
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //将数据绑定到缓冲

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); //绑定EBO元素缓冲对象
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); //链接顶点属性(设置顶点属性指针)
glEnableVertexAttribArray(0); //启用顶点属性

绘图

1
2
3
4
5
6
7
// draw our first triangle 画出两个三角形
glUseProgram(shaderProgram); //使用着色器程序
glBindVertexArray(VAO); // 绑定VAO seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organized
//glDrawArrays(GL_TRIANGLES, 0, 6);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //渲染元素
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //线框模式GL_LINE / 填充模式GL_FILL
// glBindVertexArray(0); // no need to unbind it every time

注意,EBO绘图使用的是glDrawElements,而不是glDrawArrays。

资源释放

注意VAO/VBO/EBO释放顺序。

效果

编译运行程序

四边形


GLFW入门教程02.06:EBO
https://blog.jackeylea.com/glfw/how-to-use-ebo/
作者
JackeyLea
发布于
2024年8月15日
许可协议