一段简单的绘制正方形的程序: #include <gl/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5,-0.5); glVertex2f(-0.5,0.5); glVertex2f(0.5,0.5); glVertex2f(0.5,-0.5); glEnd(); glFlush(); } int main(int argc,char**argv) { glutInit(&argc,argv); glutCreateWindow("test"); glutDisplayFunc(display); glutMainLoop(); return 0; } 运行之后可以得到这样的结果
上述程序中main()负责OpenGL的初始化,display()函数定义了要绘制的实体。
首先看main()函数
void glutInit(int* argc,char** argv)
初始化glut,应在其他glut函数和OpenGL函数之前调用。接受main函数的参数。
int glutCreateWindow(char* title)
在屏幕上创建一个窗口,该窗口的标题有title给出。
void glutDisplayFunc(void(*func(void)))
函数func()在每次需要对窗口重绘时被调用。
void glutMainLoop();
使程序进入无限事件处理循环。
在看看display()函数里面的内容
void glClear(GLbitfield mask)
清空mask所指示的所有缓存中的位,得到我们想要的指定的结果。
void glBegin(GLenum mode)
二者之间指定所要绘制的顶点。mode可取GL_POINTS、GL_LINES或GL_POLYGON等等
void glEnd()
glVertex<2,3,4><b i f d>() 描述顶点。可以有多种形式,也可以用向量,
void glFlush()
强制执行所有OpenGL命令。绘图操作后必须加上这一句。
修改GLUT中的默认值:
void glutInitDisplayMode(unsigned int mode)
设置窗口属性为mode模式,mode取值选项为如颜色模式(GLUT_RGB,GLUT_INDEX)和颜色缓存的缓 存模式(GLUT_SINGLE、GLUT_DOUBLE),默认是RGB和SINGLE。
void glutInitWindowSize(int w,int h) 设置窗口的厨师宽度和高度
void glutInitWindowPosition(int x,int y) 设置窗口的左上角相当于屏幕左上角的位置。
颜色的设置:
void glColor3<b i f d....>(r ,g ,b)
void glColor3<b i f d....>v(color) //设置绘制颜色
void glClearColor(r ,g ,b, a) //指定屏幕清空颜色,设置后需调用glClear()方能生效
OpenGL和GLUT坐标系统的差异
OpenGL中,x轴和y轴的正方向分别是向上和向右,GLUT中则是向下和向右。
二维取景
void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
指定一个二维剪裁区域,左下角坐标为(left,bottom),右上角坐标为(right,top)。位于窗口内的对象是可见的,落在窗口之外的对象则不可将,我们称其“被剪裁”。
视口
用视口来限制OpenGL仅在屏幕窗口的任一部分进行绘制。
void glViewport(GLint x,GLint y,GLsizei w,GLsizei h)
将视口的宽度设为w,高度设为h,坐下角坐标为(x,y)。
坐标系统与变换
对象坐标系或世界坐标系:开发人员使用的正是这种坐标系。可自己选定何种单位
窗口坐标系或屏幕坐标系:单位为像素。由物理显示器的属性和显示器的区域两方面决定。
OpenGL中的坐标系变换由两个矩阵决定:
1、模糊视图矩阵 2、投影视图矩阵
函数gluOrtho2D()用于为二维应用程序指定一个投影矩阵
设置这两种矩阵的典型步骤包括:
1、指定我们希望修改的矩阵。
2.将矩阵重置为单位矩阵,
3、修改当前矩阵为用户所期望的矩阵。
glMatrixMode(GL_PROJECTION)
glLoadIndentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
完善开始的那段程序:
#include <gl/glut.h> void init() { glClearColor(0.0,0.0,0.0,0.0); //指定屏幕背景为黑色 glColor3f(1.0,1.0,1.0); //设置绘制颜色为白色 glMatrixMode(GL_PROJECTION); //指定希望修改的矩阵为投影矩阵 glLoadIdentity(); //重置为单位矩阵 gluOrtho2D(-1.0,1.0,-1.0,1.0); //设置二维剪裁区域,左下角坐标为(-1,1),右上角坐标为(1,1) } void display() { glClear(GL_COLOR_BUFFER_BIT); //清理屏幕颜色为我们指定的颜色 glBegin(GL_POLYGON); //绘制模式为凸多边形 glVertex2f(-0.5,-0.5); glVertex2f(-0.5,0.5); glVertex2f(0.5,0.5); glVertex2f(0.5,-0.5); //指定绘制的四个顶点 glEnd(); glFlush(); //强制以上绘图操作执行 } int main(int argc,char**argv) { glutInit(&argc,argv); //初始化glut glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置窗口模式为单缓冲和RGB模式 glutInitWindowSize(500,500); //设置窗口大小 glutCreateWindow("test"); //设置窗口标题 glutDisplayFunc(display); //设置绘图回调函数 glutMainLoop(); //开始循环,等待响应 init(); return 0; }
得到如下结果: