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);

这样一个完整的流程就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值