[C++] [OpenGL ES 3.0] VAO,VBO,EBO示例

获取矩形和直角三角形VAO的函数

GLuint getRectangle(float x,float y,float w,float h)
{
	float ver[] =
	{
		x,y,0.0,
		x + w,y,0.0,
		x,y + h,0.0,
		x + w,y + h,0.0
	};
	float col[] =
	{
		0.0,0.0,1.0,
		0.0,0.0,1.0,
		0.0,0.0,1.0,
		0.0,0.0,1.0
	};
	GLuint ind[] =
	{
		0,1,2,
		1,2,3
	};
	
	GLuint vao;
	glGenVertexArrays(1,&vao);
	glBindVertexArray(vao);
	
	GLuint vbo[3];
	glGenBuffers(3,vbo);
	
	glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(ver),ver,GL_STATIC_DRAW);
	glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),NULL);
	glEnableVertexAttribArray(0);
	
	glBindBuffer(GL_ARRAY_BUFFER,vbo[1]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(col),col,GL_STATIC_DRAW);
	glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),NULL);
	glEnableVertexAttribArray(1);
	
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbo[2]);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(ind),ind,GL_STATIC_DRAW);
	
	glBindVertexArray(0);
	glDeleteBuffers(3,vbo);
	
	return vao;
}
GLuint getRightTriangle(float x,float y,float l1,float l2) //l1和l2是两条直角边的长度
{
	float ver[] =
	{
		x,y,0.0,
		x + l1,y,0.0,
		x,y + l2,0.0
	};
	float col[] =
	{
		1.0,0.0,0.0,
		1.0,0.0,0.0,
		1.0,0.0,0.0,
	};
	GLuint ind[] =
	{
		0,1,2,
	};
	
	GLuint vao;
	glGenVertexArrays(1,&vao);
	glBindVertexArray(vao);
	
	GLuint vbo[3];
	glGenBuffers(3,vbo);
	
	glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(ver),ver,GL_STATIC_DRAW);
	glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),NULL);
	glEnableVertexAttribArray(0);
	
	glBindBuffer(GL_ARRAY_BUFFER,vbo[1]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(col),col,GL_STATIC_DRAW);
	glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),NULL);
	glEnableVertexAttribArray(1);
	
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbo[2]);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(ind),ind,GL_STATIC_DRAW);
	
	glBindVertexArray(0);
	glDeleteBuffers(3,vbo);
	
	return vao;
}

p.s.OpenGL的坐标系和SDL、SFML之类的不一样,所以如果要一个占据屏幕正中心的矩形,应该把y设置成-1.0

GLuint rect = getRectangle(-0.5,0.5,1.0,-1.0);

顶点和颜色放一个数组

   GLfloat ver[] =
{
	-0.25,0.75,0.0, 1.0,0.0,0.0,
	0.25,0.75,0.0,  1.0,0.0,0.0,
	-0.25,0.25,0.0, 0.0,1.0,0.0,
	0.25,0.25,0.0,  0.0,1.0,0.0
};
GLuint ind[] =
{
	0,1,2,
	1,2,3
};

glGenBuffers(2,ud->VBO);
glBindBuffer(GL_ARRAY_BUFFER,ud->VBO[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(ver),ver,GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ud->VBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(ind),ind,GL_STATIC_DRAW);

glGenVertexArrays(1,&ud->VAO);
glBindVertexArray(ud->VAO);
glBindBuffer(GL_ARRAY_BUFFER,ud->VBO[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ud->VBO[1]);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6 * sizeof(float),NULL);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6 * sizeof(float),(void*)(3 * sizeof(float)));
glBindVertexArray(0);

顶点和颜色放两个数组

   GLfloat ver[] =
{
	-0.25,0.75,0.0,
	0.25,0.75,0.0,
	-0.25,0.25,0.0,
	0.25,0.25,0.0
};
GLfloat col[] =
{
	 1.0,0.0,0.0,
	 1.0,0.0,0.0,
	 0.0,1.0,0.0,
	 0.0,1.0,0.0
};
GLuint ind[] =
{
	0,1,2,
	1,2,3
};

glGenVertexArrays(1,&ud->VAO);
glBindVertexArray(ud->VAO);
glGenBuffers(3,ud->VBO);

glBindBuffer(GL_ARRAY_BUFFER,ud->VBO[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(ver),ver,GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),NULL);

glBindBuffer(GL_ARRAY_BUFFER,ud->VBO[1]);
glBufferData(GL_ARRAY_BUFFER,sizeof(col),col,GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),NULL);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ud->VBO[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(ind),ind,GL_STATIC_DRAW);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值