OpenGL8-索引缓冲区对象EBO

276 阅读2分钟
01、顶点数量
  • 上一章绘制立方体时,虽然一个立方体只有8个顶点,拆分成基本三角形图元后,一共12个三角形,需要传入36个顶点,每个顶点被重复传入了3次。
  • 使用三维软件创建的复杂模型,顶点数量多则上万个,少的也有上千,如果全部拆分成三角形,每个三角形由三个顶点组成,那传入顶点的个数就太多了。
减少传入的顶点个数
  • OpenGL还有一种以顶点索引的方式传递顶点数据,具体操作,只输入一份顶点坐标数据,没有重复。
  • 同时传入一份顶点的索引数据,索引数据是以顶点数据的下标为值,从0开始计算,每三个顶点数据构成一个三角形,这样就可以通过组织顶点的下标说明三角形是由哪些顶点组成的。从而避免将三角形的所有顶点罗列出来

  • 如上图,立方体一共有8个顶点(v0, v1 ... v7),这8个顶点组成6个表面,每个表面有两个三角形组成,例如前表面(front)由v0, v1, v2, v3四个顶点组成两个三角形(v0,v1,v2)和 (v0,v2,v3),其他面类似
  • 最后组织顶点数据和顶点索引数据如下:
   // 立方体8个顶点个顶点
   float vPositions[24] = {
        1.0,  1.0,  1.0,
       -1.0,  1.0,  1.0,
       -1.0, -1.0,  1.0,
        1.0, -1.0,  1.0,
        1.0, -1.0, -1.0,
        1.0,  1.0, -1.0,
       -1.0,  1.0, -1.0,
       -1.0, -1.0, -1.0
   };
   // 顶点索引数据,6个表面,每个面由两个三角形组成
   int indices[36] = {
       0,1,2, 0,2,3,
       0,3,4, 0,4,5,
       0,1,6, 0,5,6,
       1,2,7, 1,7,6,
       2,3,4, 2,4,7,
       4,7,6, 4,6,5
   };
02、GL_ELEMENT_ARRAY_BUFFER
  • 顶点数据保存在顶点缓冲区(VBO)中,而顶点索引数据保存在顶点索引缓冲区(EBO)中,也是调用glBindBuffer方法绑定数据,但是参数不同
   glGenBuffers(1,ebo);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[0]); 
   glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
  • 还有绘制三角形的方法是glDrawArrays并传入顶点的个数作为入参,但是三角形信息保存在顶点索引缓冲区中,需要调用glDrawElements方法,并传入索引数据的元素个数作为入参
   glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
03、实战-传入顶点索引数据绘制立方体
  • 效果图和之前一样
  • ebo的概念非常重要,因为在实际项目中都是通过图形软件导出得到模型文件(例如obj文件),文件中的顶点数据都只会存储一次,并以ebo的方式组织成三角形,只有理解了ebo才能看懂obj等模型文件中顶点数据的组织方式