码迷,mamicode.com
首页 > 其他好文 > 详细

OpenGL Two (Triangle__EBO)

时间:2019-11-16 17:59:44      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:重复   使用   类型   bin   需要   问题   个数   gen   image   

冠冕堂皇的引言

之前已经画了一个憨憨的三角形。如果是画由两个三角形组成的四边形的话......

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)

标签:重复   使用   类型   bin   需要   问题   个数   gen   image   

原文地址:https://www.cnblogs.com/LittleBanana/p/11872262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!