获取矩形和直角三角形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);