系列教程索引:OpenGLut入门索引
上一篇:OpenGLut开发入门教程01:显示一个基本空白窗口
上一篇的空白界面相当于一个绘图板,我们需要显示什么就在什么画什么。
本文介绍如何在画布上绘制点、线、圆、三角形、四边形、三角函数。
首先函数基本的架构是:

在main函数中glut*Func()的参数为回调函数,需要在main函数外独立实现。
重要的是四个回调函数:
- initGL,初始化函数
- reshapeGL,尺寸调整函数,当窗口的尺寸发生变化时调用此函数重新绘图
- keyboard,捕获键盘输入并处理
- displayGL,将想要显示的图像绘制出来的函数
其他函数说明见OpenGL函数功能说明系列。
在使用之前先说明一下窗口坐标。现在的的显示屏幕越来越大,为了配合高分辨率,OpenGL窗口坐标设置如下。
窗口四个顶点为(-1,1)、(1,1)、(1,-1)、(-1,-1)

超出-1/1的部分将不可见。如果需要超出-1/1的部分,就需要使用glTranslatef。
将窗口坐标极限约束后就不会出现不同窗口尺寸显示异常的问题。
点
1 2 3 4
| glPointSize(5.0f); glBegin(GL_POINTS); glVertex2f(0.5f, 0.5f); glEnd();
|
设置点大小,点位置为(0.5f,0.5f)。

在OpenGL名词解释中说过,OpenGL输入为点,OpenGL自动将点填充为片元(面),并上色,那么如何确定输入点是有效输入呢?以glBegin()开始,以glEnd()结束,在两个函数中间的是有效点,其他的不算。
线
1 2 3 4 5 6 7 8
| glEnable(GL_LINE_STIPPLE); glLineStipple(2, 0x0F0F); glLineWidth(10.0f); glBegin(GL_LINES); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.5f); glEnd(); glDisable(GL_LINE_STIPPLE);
|
线型为虚线,线宽为10,起点为(0,0)终点为(0.5,0.5)。绘图完成后取消线型。

圆
圆绘图采用割圆术的方法。
绘制正多边形,多边形变数越多,越接近圆。

1 2 3 4
| glBegin(GL_POLYGON); for (int i = 0; i<n; ++i) glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i)); glEnd();
|
Pi为圆周率,割圆术是用来求圆周率的,我们用割圆术和圆周率绘制圆。n是正多边形的边数,越大越接近圆(可自行测试)。

代码中默认窗口大小为640x480,但是此图明显是正方形,如果窗口不是正方形,圆将变为椭圆。原因请理解坐标系。
三角形
1 2 3 4 5
| glBegin(GL_TRIANGLES); glVertex3f(-0.5,0,0); glVertex3f(0,1,0); glVertex3f(0.5,0,0); glEnd();
|
按照顺序用线连接三个点,并在内部填充白色。

四边形
1 2 3 4 5 6
| glBegin(GL_QUADS); glVertex3f(-0.5,0.5,0); glVertex3f(0.5,0.5,0); glVertex3f(0.5,-0.5,0); glVertex3f(-0.5,-0.5,0); glEnd();
|

窗口大小见圆部分。
五角星
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| GLfloat a = 1 / (2 - 2 * cos(72 * Pi / 180)); GLfloat bx = a * cos(18 * Pi / 180); GLfloat by = a * sin(18 * Pi / 180); GLfloat cy = -a * cos(18 * Pi / 180); GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by }; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINE_LOOP); glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd();
|
连接每个点

三角函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); glEnd(); glBegin(GL_LINE_STRIP); for (x = -1.0f / factor; x<1.0f / factor; x += 0.01f) { glVertex2f(x*factor, sin(x)*factor); } glEnd();
|
factor是放大因子。

代码中是整合在一起的,按空格键就可以切换。
组合图形
上面文章介绍了如何在窗口中绘制图像,但是因为其坐标系问题,一次只能绘制一个图像。
本部分介绍如何在窗口中绘制多个基本对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd();
glTranslatef(3.0f,0.0f,-1.0f); glBegin(GL_QUADS); glVertex3f(-1.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glEnd();
|
先将绘图位置移至左侧(-1.5f,0.0f),在此处绘制一个三角形;在三角形位置的基础上,向右移(3.0f,0.0f),绘制一个正方形。
效果为:

完整源码在OpenGL_Freshman下的OpenGLut的02.triangle中。
下一篇:OpenGLut开发入门教程03:彩色多边形