OpenGL Two (Triangle__EBO)
Posted littlebanana
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL Two (Triangle__EBO)相关的知识,希望对你有一定的参考价值。
冠冕堂皇的引言
之前已经画了一个憨憨的三角形。如果是画由两个三角形组成的四边形的话......
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, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
此时就会出现一个问题,我们指定右下角和左上角两次,就显得有一丝的多余。所以我们引入了索引缓冲对象( Element Buffer Object , EBO )( 也叫IBO,Index Buffer Object )的概念。
索引缓冲对象
- 和顶点缓冲对象( VBO )一样,EBO也是一个缓冲,只不过他只储存索引罢了。
- OpenGL通过EBO来明确该绘制哪个顶点。
使用方法
- 首先定义不重复的顶点 和 绘制矩形所需要的索引
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);
//以上代码把刚刚生成的EBO缓冲绑定到GL_ELEMENT_ARRAY_BUFFER目标上
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
//以上代码的作用是把指点定义的索引顺序数据复制到缓冲中
和VBO类似,以上所有代码建立了顶点绘制顺序数据与EBO之间的联系,应为之前已经定义了VAO缓冲而且帮点了Element Buffer,也就建立了顶点绘制顺序与VAO之间的关系。
绘制
- 在实际绘制的时候,因为我们传递了GL_ELEMENT_ARRAY_BUFFER当作缓冲目标。所以要用glDrawElements 来替换 glDrawArrays 函数,来指明我们从索引缓冲渲染。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
- 对于glDrawElements函数
- 第一个参数指定了绘制模式
- 第二个参数是我们打算绘制顶点的个数
- 第三个参数是索引的类型
- 最后一个参数是偏移量
效果图和憨憨代码
( 代码照着上次的改一下就??辽~ )
https://paste.ubuntu.com/p/ZBt24n7wC6/
以上是关于OpenGL Two (Triangle__EBO)的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 VAO 和 EBO (openGL) 绘制多个对象