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来明确该绘制哪个顶点。

使用方法

  1. 首先定义不重复的顶点 和 绘制矩形所需要的索引
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  // 第二个三角形
};
  1. 创建索引缓冲对象( 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)的主要内容,如果未能解决你的问题,请参考以下文章

初识OpenGL (-)EBO元素缓冲对象

初识OpenGL (-)EBO元素缓冲对象

无法使用 VAO 和 EBO (openGL) 绘制多个对象

Android OpenGL ES 学习 – 使用 VBOVAO 和 EBO/IBO 优化程序

VAO VBO EBO

OpenGL入门之渲染管线pipeline,VAOVBO和EBO