已经是第二个学期学习计算机图形学了,本科的时候叫“计算机图形学”,现在叫“高级计算机图形学”。但由于学习态度不甚端正,加上本人实在是才疏学浅,所以对OpenGL编程的理解总是局限于细枝末节,每次要写程序实验才搬起书来一个一个找函数,凑成一个“紧急集合”似的程序。
由于本人也在渐渐领悟“知行合一”的珍贵教诲,也希望能在研究生阶段多多总结自己的学习之路,以期有更多的收获并发扬光大之。今天开始整理OpenGL的学习内容,以后还可能整理一些其他的东西(比如CUDA编程,我也已经在写《编程珠玑》的读书总结)。
主要参考书是 计算机图形学(第三版)(豆瓣)。
闲话少表,下面就开始。本文通过一个十分简单的OpenGL程序来阐述这类程序的编写流程和最常见的OpenGL函数。关于在Ubuntu上编程环境的配置和编译方法,在之前的一片文章Ubuntu 12.10 安装 OpenGL中已有提及。
- OpenGL上手程序
#include <GL/glut.h> void init(void){ glClearColor(1.0, 1.0, 1.0, 0.0); /*显示窗口的背景色 设为白色,最后一个参数为透明度,此处无用*/ glMatrixMode(GL_PROJECTION); //设置投影类型,使用正投影 gluOrtho2D(0.0, 200.0, 0.0, 150.0); /*设置世界坐标系的范围, 在此范围之内的图形才会显示在窗口中,其中x轴坐标0-200.0,y轴为 0-150.0,以左下角为原点,右上角为(200.0,150.0)*/ } void lineSegment(void){ glClear(GL_COLOR_BUFFER_BIT); //清空显示窗口中的内容 glColor3f(1.0, 0.0, 0.0); //设定绘制颜色为Red glBegin(GL_LINES); //开始绘图,在两个坐标点之间画线 glVertex2i(180, 15); glVertex2i(10, 145); glEnd(); //结束绘图,与上面的 glBegin 对应 glFlush(); } void main(int argc, char *argv[]) { glutInit(&argc, argv); //初始化GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); //设置窗口宽度400、高度300像素 glutCreateWindow("An Example OpenGL Program");/* 设定显示窗口的标题*/ init(); //调用初始化函数 glutDisplayFunc(lineSegment); //设定显示函数函数名 glutMainLoop(); }
- 代码解析
上述代码展示的是一个绘线程序,除了main函数,还有init和lineSegment两个函数。其中init函数为图形程序的显示做一些初始化工作,lineSegment函数则是主要的绘图函数。
main函数中,对GLUT进行初始化后,用glutInitDisplayMode设定显示模式为“单缓冲区,RGB颜色模式”。最后调用glutMainLoop之后,所有已创建的显示窗口连同其中的图形内容将被激活;该函数必须是最后一个,它显示初始图形并使程序进入检查鼠标或键盘等设备输入的无穷循环之中。
除了使用glutInitWindowsize设置窗口大小外,还可以设置窗口左上角与屏幕左上角的距离,如调用
glutInitWindowPosition(50, 100);
将会使显示窗口左上角在屏幕左边界向右50个像素,上边界向下100个像素处。
其余两个函数的解析在代码注释中已详细说明。
- 编译方法
我发现在ubuntu 12.04中编译
gcc -lGL -lGLU -lglut glExample.c -o glExample
会出错,而编译
gcc glExample.c -lGL -lGLU -lglut -o glExample
是正确的。可能与gcc不同版本的默认设置有关系,我没有再深究。
- 运行结果
