在OpenGL中,所有的几何物体都是由一组有序的定点描述的,我们通过glVertexXX()来指定顶点。
绘制几何图元,我们就是需要告诉OpenGL如何根据一组顶点来描述图元,我们需要在glBegin和glEnd之间来指定顶点,用于绘制图元。
OpenGL中支持以下类型的方式,来绘制几何图元:
GL_POINTS 单个的点
GL_LINES 一对顶点用于描述一条直线
GL_LINE_STRIP 一系列的连接直线(例如v0 v1 v2 v3四个点,绘制的效果则是v0-v1一条直线 v1-v2一条直线 v2-v3一条直线)
GL_LINE_LOOP 和上面的相同,只不过最后一个点与v0绘制一条直线
GL_TRIANGLES 三个顶点用于描述一个三角形
GL_TRIANGLE_STRIP 绘制一系列的三角形,分别通过顶点(v0,v1,v2)(v2,v1,v3)(v3,v2,v4)以此类推的顺序绘制
GL_QUADS 四个顶点用于描述一个四边形
GL_QUAD_STRIP 绘制一系列四边形,分别通过顶点(v0,v1,v3,v2)(v2,v3,v5,v4)(v4,v5,v7,v6)以此类推绘制
GL_POLYGON 用一系列的顶点描述简单的凸多边形
我们在上一节的Render函数中修改,代码如下:
#include <gl\glut.h>
void Render(){
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//绘制多边形
glColor3f(1.0,1.0,0.0);
glBegin(GL_POLYGON);
glVertex2f(-1.0,1.0);
glVertex2f(-1.0,0.8);
glVertex2f(-0.8,0.8);
glVertex2f(-0.8,1.0);
glEnd();
//绘制点
glColor3f(1.0,0,0);
glPointSize(4.0f);
glBegin(GL_POINTS);
glVertex2f(-0.7f,0.95f);
glVertex2f(-0.6f,0.95f);
glVertex2f(-0.7f,0.85f);
glVertex2f(-0.6f,0.85f);
glEnd();
//绘制线
glColor3f(0,1.0,0);
glBegin(GL_LINES);
glVertex2f(-0.5f,1.0f);
glVertex2f(-0.5f,0.5f);
glEnd();
glColor3f(0,0,1.0);
glBegin(GL_LINE_STRIP);
glVertex2f(-0.4f, 1.0f);
glVertex2f(-0.4f, 0.5f);
glVertex2f(-0.2f, 1.0f);
glVertex2f(-0.2f, 0.4f);
glEnd();
glColor3f(1.0,1.0,0);
glBegin(GL_LINE_LOOP);
glVertex2f(0.4f, 1.0f);
glVertex2f(0.4f, 0.5f);
glVertex2f(0.2f, 1.0f);
glVertex2f(0.2f, 0.4f);
glEnd();
//绘制三角形
glColor3f(1.0,0,1.0);
glBegin(GL_TRIANGLES);
glVertex2f(0.7f, 1.0f);
glVertex2f(0.7f, 0.5f);
glVertex2f(0.5f, 1.0f);
glEnd();
glColor3f(1.0,0,1.0);
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(-0.9f, 0.2f);
glVertex2f(-0.7f, 0.2f);
glVertex2f(-0.5f, 0.0f);
glVertex2f(-0.3f, 0.0f);
glEnd();
glColor3f(1.0,0,1.0);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(0.1f, 0.2f);
glVertex2f(0.3f, 0.2f);
glVertex2f(0.5f, 0.0f);
glVertex2f(0.7f, 0.0f);
glEnd();
//绘制四边形
glColor3f(0.0,1.0,1.0);
glBegin(GL_QUADS);
glVertex2f(-0.9f, -0.2f);
glVertex2f(-0.7f, -0.2f);
glVertex2f(-0.1f, -0.6f);
glVertex2f(-1.0f, -0.6f);
glEnd();
glColor3f(0.0,1.0,1.0);
glBegin(GL_QUAD_STRIP);
glVertex2f(0.1f, -0.2f);
glVertex2f(0.3f, -0.4f);
glVertex2f(0.5f, -0.2f);
glVertex2f(0.0f, -0.4f);
glVertex2f(0.7f, -0.4f);
glVertex2f(0.8f, -0.6f);
glEnd();
glFlush();
}
int main(int arg, char** argv){
glutInitWindowSize(600,600);
glutInitWindowPosition(420,150);
glutCreateWindow("My OpenGL Window");
glutDisplayFunc(Render);
glutMainLoop();
}
我们在每次绘制之前,通过glColor3f来指定该次绘制图元的颜色。
另外,在绘制中还有以下函数可以使用:
glPointSize(GLfloat size) 设置被渲染的点的宽度的像素大小
glLineWidth(GLfloat width) 设置被渲染直线的宽度大小(OpenGL 3.1中不支持大于1.0的值)
glLineStipple(GLint factor, GLushort pattern) 定义点画模式(需要通过glEnable(GL_LINE_STIPPLE)来启用),具体样式阅读文档。
glPolygonMode(GLenum face,GLenum mode) 定义多边形的正面和北面的绘图模式,表示多边形被画成点,轮廓还是填充等等。
glFrontFace(GLenum mode) 控制多边形的正面
glCullFace(GLenum mode) 控制剔除多边形表面(需要通过glEnable(GL_CULL_FACE)来启用剔除)
下面我们来看看运行效果图:
文章评论