EBO的使用
EBO 其实就是个索引,绑定在相应的VAO中,用来描述绘制顺序。比如在OpenGL绘制三角形的时候,假设有四个顶点,我称他们分别为1,2,3,4号顶点,常规绘制三角形函数是按三个点为一组,{1,2,3,4},他就只会绘制123为三角形,4就不管了,如果我们想拿一个共用边加上4绘制三角形比如拿12边,就需要写成{1,2,3,4,1,2},他不够灵活,像这样存储的话,如果每个顶点还有颜色什么的数据就会导致需要的内存过大,这里就用到EBO了,顶点数据差不多,区别就在于当引入顶点的时候只需要存储顶点数据,其他的属性通过绑定VAO实现可重复调用,以达到节省内存的作用。
数据准备
//准备数据
//顶点数据x,y,z
float position[]={
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.0f,0.5f,0.0f,
0.5f,0.5f,0.0f
};//索引(连线顺序)
uint indices[]={
0,1,2,
2,1,3
};
vbo创建
接下来实现一个简单的EBO,首先我们需要创建一个VBO,在显卡显存中开辟一个空间存储顶点数据
//创建VBO
GLuint vbo;
glGenBuffers(1,&vbo);//创建一个缓冲区
glBindBuffer(GL_ARRAY_BUFFER,vbo);//把vbo绑定上去
glBufferData(GL_ARRAY_BUFFER,sizeof(position),position,GL_STATIC_DRAW);//把顶点数据存进去
ebo创建
//创建EBO
GLuint ebo;
glGenBuffers(1,&ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo);//GL_ELEMENT_ARRAY_BUFFER是状态机上的索引接口
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
vao创建
//创建VAO
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
vao绑定vbo,ebo
//绑定vbo,ebo加入属性描述信息
//加入位置描述信息
glBindBuffer(GL_ARRAY_BUFFER,vbo);//可省略,因为下面glVertexAttribPointer会向上查询绑定的vbo来绑定vao
glEnableVertexAttribArray(0);//用vao的0号位置信息描述状态机已绑定的vbo
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(float)*3,(void*)0);//加入ebo到vao
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo);//这个不能省略,从头到尾没有glVertexAttribPointer这样的函数向上查询,需要手动将ebo绑定给vao
解绑
适当的时候要注意解绑,避免需要绑定别的vbo或者vao的时候报错
//解绑
glBindVertexArray(0);
这样一个完整的流程就完成了。