从零开始学习OpenGL(2) 绘制几何图元

在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)来启用剔除)

下面我们来看看运行效果图:

发表评论

电子邮件地址不会被公开。