多种方式画一个三角形
在OpenGL中最最基本的图元是点,由点可以组成各种基本的图形(如线段、三角形、多边形)和复杂的图形(如各种立方体图形等)。在各种图形当中,三角形又是最为基础的,因此掌握三角形的画法是必须的。下面以个人的认识和能力完成一个三角形的多种画法。
1.利用glBegin()和glEnd()函数的不同模式来画三角形(注意,顶点坐标必须写在glBegin()和glEnd()函数之间)
(1)GL_TRIANGLES模式,即三角形模式,使用glVertex3f() 函数直接给出三角形的三个顶点坐标。GL_POLYGON模式,即凸多边形模式,与之类似,使用glVertex3f() 函数给出三个顶点,将其强制成三边形,即为凸三边形。
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
运行调试结果:(如图1所示)
图1
(2)GL_LINE_LOOP模式,即封闭线模式,给出的顶点每两个点相连,且首尾相连。
glBegin(GL_LINE_LOOP);
glVertex3f(-0.5f,-0.5f,0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glVertex3f(0.0f,0.5f,0.0f);
glEnd();
运行调试结果:(如图2所示)
图2
(3)其它模式,如GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_LINES、GL_POINTS等。
对于GL_LINES和GL_POINTS模式的使用采用的是“叠加”的方法,即将多条线或多个点按照一定的规则叠加起来,组成一个近似三角形;
对于GL_TRIANGLE_STRIP和GL_TRIANGLE_FUN模式,都是画“三角形群”的方法,其中GL_TRIANGLE_STRIP用来画空间立体的三角形,而GL_TRIANGLE_FUN用来画三角扇形。
2.使用VBO(Vertex Buffer Object,顶点缓冲对象)画三角形
定义顶点数组:
static const GLfloat g_VertexBufferData[]={
-1.0f,-1.0f,0.0f,
1.0f,-1.0f,0.0f,
0.0f,1.0f,0.0f,
};
首先,创建VAO(Vertex Array Object,顶点数组对象),
存储了顶点数据的格式以及顶点数据数据所需的缓存对象的
引用。包括,声明顶点数组编号(m_VertexArrayID)、利用glGenVertexArrays() 函数生成顶点数组编号,利用glBindVertexArray() 函数绑定顶点数组编号
GLuint m_VertexArrayID;
glGenVertexArrays(1,&m_VertexArrayID);
glBindVertexArray(m_VertexArrayID);
GLuint m_VertexBuffer;
glGenBuffers(1,&m_VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER,m_VertexBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(g_VertexBufferData),g_VertexBufferData,GL_STATIC_DRAW);
最后,画三角形。包括,利用glEnableVertexAttribArray() 函数打开顶点属性矩阵,利用glBindBuffer() 函数再次绑定当前对应要操作的顶点缓冲区,利用glVertexAttribPointer() 函数设置顶点属性矩阵(主要用来根据其顶点数据大小、类型、位置来设定),利用glDrawArrays() 函数来画三角形,利用glDisableVertexAttribArray() 函数来关闭顶点属性矩阵。
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,m_VertexBuffer);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glDrawArrays(GL_TRIANGLES,0,3);
glDisableVertexAttribArray(0);
运行调试结果:(如图1所示)