VAO VBO VEO

VBO与VAO,两者可以完全不相关。VBO就是通过那几个函数,在GPU显存中创建一块BUFFER,用于存储和顶点以及其属性相关的信息。
 GLfloat vertices[] = {
-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 ,
};
顶点索引即如下
 static GLshort frontIndices[] = {0, 1, 3, 2};//四个顶点即其中一个面
然后我们将这些个顶点数组和顶点索引上传至GPU的显存,如下
glGenBuffers(3,buffers);//创建3块buffer
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);//先将第一块buffer绑定到当前
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),vertices, GL_STATIC_DRAW);//将顶点数组放入这个buffer
glVertexPointer(3, GL_FLOAT, 0, 0);//指定这个buffer的格式,3代表3个float值为一个顶点,第一个0代表跨度,这里数值是紧密排列的,最后一个是数组的入口地址*point,由于已经将buffer绑定到当前,所以填0
glEnableClientState(GL_VERTEX_ARRAY);//使用这个buffer,一定不要忘记
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);//这里开始是将第二块buffer绑定到当前,上传color数据,和顶点的做法一样,不多赘述了
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glEnableClientState(GL_COLOR_ARRAY);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[2]);//将第三块buffer绑定到当前,用于上传存储顶点索引的数据,因此BUFFER类型变更为GL_ELEMENT_ARRAY_BUFFER
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(frontIndices),frontIndices,GL_STATIC_DRAW);//同样是对buffer进行填充
经过以上代码,某个图元的顶点位置以及颜色和索引信息就已经放入GPU了,接下来只要在display函数中,调用glDrawElements就可以绘制了
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));//由于索引定义的是4个点,因此第一个参数mode是四边形,第二个是索引的size,第三个是索引的数据类型。注意! glDrawElements只接受3种数据类型,当时我因为指定索引类型为GL_INT导致无法绘制被卡住了N长时间,坑人啊!最后一个是指针地址,由于当前绑定的buffer是buffer[2],因此填0即可。
最后别忘记了,VBO是需要glew库支持的,所以要记得在头文件中添加


glVertexAttribPointerglVertexPointer是同一个东西,只是如果用了glVertexAttribPointer,那么我们就不需要死板的只指定vertice为顶点位置,而是可以创建一个包含了所有顶点位置+顶点颜色+顶点法线+顶点xxx的数组,通过一次将其送入显存,然后调用glVertexAttribPointer索引其属性就可以实现。比方说我有个attrib[]数组,前3位为位置,后面依次为颜色,法线,这样子就有3个index,依次为0,1,2.在调用glVertexAttribPointer的时候,先 glEnableVertexAttribArray(0);在用代码glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0,0);就表示指定了buffer中的第一个索引为pos,然后用,颜色和法线如法炮制。


float position[9]={
	-0.8f, -0.8f, 0.0f,
	0.8f, -0.8f, 0.0f,
	0.0f, 0.8f, 0.0f};

一、

	/***单独vao绘制***/
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3, GL_FLOAT, 0,position);/*size:指定每个顶点对应的坐标个数,可取2,3,4  
						   type:指定数组中每个顶点坐标的数据类型:GL_BYTE, GL_SHORT,GL_FIXED,GL_FLOAT;
						   stride:指定连续顶点间的字节排列方式,即<从一个数据的开始到下一个数据的开始,
							所相隔的字节数>,为0表示数组中的顶点被认为按照紧凑方式排列,默认为0;
						   pointer:指定了数组中第一个顶点的首地址,默认值为0。*/
	glDrawArrays(GL_TRIANGLES, 0, 3);
	glDisableClientState(GL_VERTEX_ARRAY);

二、

	/***单独vbo绘制***/
	GLuint vboNum;
	glGenBuffers(1,&vboNum);
	glBindBuffer(GL_ARRAY_BUFFER,vboNum);
	glBufferData(GL_ARRAY_BUFFER,9*sizeof(float),position,GL_STATIC_DRAW);

	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3, GL_FLOAT, 0, 0);
	glDrawArrays(GL_TRIANGLES, 0, 3);
	glDisableClientState(GL_VERTEX_ARRAY);

三、

	/***使用glVertexPointer()、vbo和vao传递数据***/
	/***vbo***/
	GLuint vboNum;
	glGenBuffers(1,&vboNum);
	glBindBuffer(GL_ARRAY_BUFFER,vboNum);
	glBufferData(GL_ARRAY_BUFFER,9*sizeof(float),position,GL_STATIC_DRAW);

	/***vao***/
	GLuint vaoNum;
	glGenVertexArrays(1,&vaoNum);
	glBindVertexArray(vaoNum);

	glBindBuffer(GL_ARRAY_BUFFER,vboNum);
	glVertexPointer(3, GL_FLOAT, 0,(void *)NULL);

	glEnableClientState(GL_VERTEX_ARRAY);
	glBindVertexArray(vaoNum);
	glDrawArrays(GL_TRIANGLES, 0, 3 );
	glDisableClientState(GL_VERTEX_ARRAY);

四、

	/***使用glVertexAttribPointer()、vbo和vao传递数据***/
	/***vbo***/
	GLuint vboNum;
	glGenBuffers(1,&vboNum);
	glBindBuffer(GL_ARRAY_BUFFER,vboNum);
	glBufferData(GL_ARRAY_BUFFER,9*sizeof(float),position,GL_STATIC_DRAW);

	/***vao***/
	GLuint vaoNum;
	glGenVertexArrays(1,&vaoNum);
	glBindVertexArray(vaoNum);
	glEnableVertexAttribArray(0);

	glBindBuffer(GL_ARRAY_BUFFER,vboNum);
	glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void *)NULL);

	glBindVertexArray(vaoNum);
	glDrawArrays(GL_TRIANGLES, 0, 3 );


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值