先来分析一段测试用的代码:
#include
void Draw()
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("HelloOpenGL");
glutDisplayFunc(&Draw);
glutMainLoop();
return 0;
}
下面来解释一下main函数中几个glut函数的作用:
1、glutInit,glut初始化,这个函数必须在使用其它的GLUT函数之前调用一次
2、glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色。
3、glutInitWindowPosition,设置窗口在屏幕中的位置。
4、glutInitWindowSize,设置窗口的大小。
5、glutCreateWindow,创建窗口,给定的字符串参数是窗口的标题。
6、glutDisplayFunc,注册一个绘图函数。我们目前只管把画图函数Draw()作为参数就行了。
7、glutMainLoop,进行一个消息循环。
注意:main函数中glutInitDisplayMode()函数的参数可以用来设置程序的缓冲区,在做动画的时候使用。
在实现动画这一块,OpenGL给我们提供了双缓冲。当A缓冲区显示时,B缓冲区正在绘制图形。当B绘制完毕时,就交换缓冲区,此时B显示,而A就进行绘画。从而实现平滑地显示每一帧地显示,观众就永远看不到没有完成的画面。计算机的在交换缓冲区的时候,速度很快,所以一般用户是觉察不到的。
为了能让我们的程序能够使用双缓冲,我们需要改变main函数中glutInitDisplayMode()函数的参数,把GLUT_SINGLE改为GLUT_DOUBLE,表示我们现在要使用双缓冲(double)了,以前是单缓冲(single)。
在draw函数中,gl开头的函数,便是我们的OpenGL的标准函数。
glClear()语句的作用是使用清除颜色来清除指定的缓冲区。参数GL_COLOR_BUFFER_BIT是指用清除颜色来清除当前可写的颜色缓冲,其中,清除颜色可以由glClearColor()函数来设定。
glRectf()作用是画一个矩形,四个参数分别为对角线上左下方的点的横纵坐标和右上方点的横纵坐标。
glFlush()的作用是让之前的gl命令执行
OpenGL规定:在你指定顶点之前,你必须调用glBegin()函数,指定顶点之后,必须调用glEnd()。而其中glBegin函数的参数与我们希望它绘制的图形有关。
比如:
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.5f);
glEnd();
此时,这两个点会被描绘出来。如果将GL_POINTS改为GL_LINES,一条以这两个点为端点的直线将被画出来。大家可以把上一章中Draw函数改成
voidDraw()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.5f);
glEnd();
glFlush();
}
运行后就可以看到两个很小的白点。
下面的程序使用了一般二维作图的方法
#include
void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
//坐标都是相对于窗口中心的 画图程序要在glBegin和glEnd之间
//画点 可以指定点大小
glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.5f);
glEnd();
//画线 可以指定线宽、虚线之类的
glLineWidth(2.8f);
glEnable(GL_LINE_STIPPLE);
glLineStipple(2,0x0F0F);
glBegin(GL_LINES);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.5f);
glEnd();
//画线段
glColor3f(0.4,0.2,0.1);
glBegin(GL_LINE_STRIP);
glVertex2f(0,0);
glVertex2f(0.3,0.3);
glVertex2f(0.4,0.5);
glEnd();
//画三角形
glBegin(GL_TRIANGLES);
glVertex2f(0,0);
glVertex2f(0.5,0);
glVertex2f(0.3,-0.3);
glEnd();
//画四边形
glColor3f(0,0.5,0.3);
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0,0.5);
glVertex2f(-0.5,0.5);
glVertex2f(-0.5,0);
glEnd();
//画N边形
glColor4f(0,0.5,0.3,0.3);
glBegin(GL_POLYGON);
glVertex2f(0,0);
glVertex2f(-0.2,-0.1);
glVertex2f(-0.3,-0.4);
glVertex2f(-0.7,-0.5);
glVertex2f(-0.75,-0.55);
glVertex2f(-0.8,-0.3);
glEnd();
////画白色六角形
glShadeModel(GL_SMOOTH); //设置多边形的着色模式,可以给每个顶点指定不同的色彩,使用Smooth模式平滑过渡
glBegin(GL_TRIANGLES);
glColor3f(0.7,0,0.3);
glVertex2f(0,0.5);
glColor3f(0.5,0.2,0.3);
glVertex2f(-0.4,-0.3);
glColor3f(0.3,0.3,0.4);
glVertex2f(0.4,-0.3);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(0.3,0.4,0.3);
glVertex2f(-0.4,0.3);
glColor3f(0.2,0.4,0.4);
glVertex2f(0.4,0.3);
glColor3f(0,0.5,0.3);
glVertex2f(0,-0.5);
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("HelloOpenGL");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}