首页 > 叽歪生活 > Linux下openGL开发简介

Linux下openGL开发简介

OpenGL是一个工业标准的三维计算机图形软件接口,它由SGI公司发布并广泛应用于Unix、OS/2、Windows/NT等多种平台,当然也包括 Linux。在Windows/NT平台上,一般的开发工具如VC、BC、Fortran Powerstation等都支持直接的OpenGL应用的开发;在商用Unix平台上,Motif同样很好的支持OpenGL(毕竟OpenGL最初是 工作站上的东西);那么在Linux上呢?
本文不着力于OpenGL编程的方法和技巧,而是把重点放在如何在Linux平台上开发OpenGL程序。介绍支持OpenGL的几个工具包,并辅以详细的实例来阐述。

1. Linux下OpenGL编程环境简介

OpenGL不是自由软件,它的版权、商标(OpenGL这个名字)都归SGI公司所有。但在Linux下有OpenGL的取代产品:Mesa。 Mesa提供和OpenGL几乎完全一致的接口,对利用OpenGL API编程的人来说,几乎感觉不到任何差异。Mesa是遵循GPL协议(部分遵循LGPL协议)的自由软件,而且,正是由于Mesa的自由性,它在对新硬 件的支持度等方面都超过了OpenGL。Mesa可以从www.mesa3d.org取得。得到Mesa后,依照说明即可生成编写程序所需要的动态、静态 连接库和头文件。
了解OpenGL的读者都知道,OpenGL本身只提供三维图形接口,不具备绘制窗口、接受响应、处理消息等功能。这些 功能必须由第三方的开发环境提供,如上面提及的VC等等。有人会想,既然在Motif下可以开发OpenGL程序,那么,使用Linux下的 Lesstif也应该可以。是的,的确可以,但不幸的是,Linux下的Lesstif是一个很不成熟的产品,而且也不具有可移植性,所以应用 Lesstif开发的人很少。下面我们简单介绍几个常用的工具包。
在Linux下开发OpenGL程序,最常用的工具是GLUT(The OpenGL Utility Toolkit)。它可以创建一个或多个OpenGL窗口,响应、处理用户的交互操作、简单的弹出式菜单以及一些内置的绘图和字体处理功能。GLUT和 OpenGL一样,可以移植于多种平台。由于它良好的表现,现在它已经成为Mesa发布的标准套件之一。
另一个很好的开发工具包是 FLTK(Fast Light Tool Kit),这是一个用C++编写的图形界面开发工具。和GTK++、KDE不同,它只关注于图形界面的设计,而尽量不牵涉其他的实际应用。这个特点使得它 比其他许多开发工具简练和高效。而且,它同样也是一个具有良好移植性的开发工具。事实上,它现在正引来越来越多人的兴趣,许多商业软件(尤其是致力于开发 嵌入式桌面系统的软件)都选用了它作为图形界面的开发工具。关于它的详细情况参见作者的另一篇文章《FLTK—一个优秀的图形界面开发工具包》。在 FLTK里有一个组件:Fl_Gl_Window是专门的OpenGL窗口,利用它开发OpenGL程序相当方便。
最后要提的是GTK和 KDE,它们是目前在Linux下用的最多的开发工具。GTK本身并不直接支持OpenGL(新的版本是否支持,尚不太清楚),但有人开发了支持 OpenGL的Widget,叫做GLAREA,需要的读者可以到网上去查找或者与本文作者联系。KDE提供了对OpenGL的支持,但它的缺陷之一是 KDE只运行于Linux系统,不具有可移植性。在这里,我将主要向大家介绍前面两个工具包。

2. 用GLUT开发OpenGL程序

2.1 如何获得
GLUT可以从Mesa中获得,读者也可以直接到它的主页去下载它:                       http://reality.sgi.com/employees/mjk_asd/glut3/glut3.html。按照说明安装后在OpenGL 的头文件GL目录下将会有GLUT的头文件glut.h,同时安装的还有库文件libglut.a或libglut.so。有了它们以后,就可以用 GLUT来编程了。

2.2 一个简单的例子
下面,我们先看一个简单的例子。这个例子画一个立体的球。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* light.c
 此程序利用GLUT绘制一个OpenGL窗口,并显示一个加以光照的球。
 */
 /* 由于头文件glut.h中已经包含了头文件gl.h和glu.h,所以只需要include 此文件*/
 # include
 # include
 
/* 初始化材料属性、光源属性、光照模型,打开深度缓冲区 */
 void init ( void )
 {
 GLfloat mat_specular [ ] = { 1.0, 1.0, 1.0, 1.0 };
 GLfloat mat_shininess [ ] = { 50.0 };
 GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };
 
glClearColor ( 0.0, 0.0, 0.0, 0.0 );
 glShadeModel ( GL_SMOOTH );
 
glMaterialfv ( GL_FRONT, GL_SPECULAR, mat_specular);
 glMaterialfv ( GL_FRONT, GL_SHININESS, mat_shininess);
 glLightfv ( GL_LIGHT0, GL_POSITION, light_position);
 
glEnable (GL_LIGHTING);
 glEnable (GL_LIGHT0);
 glEnable (GL_DEPTH_TEST);
 }
 /*调用GLUT函数,绘制一个球*/
 void display ( void )
 {
 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glutSolidSphere (1.0, 40, 50);
 glFlush ();
 }
 /* 定义GLUT的reshape函数,w、h分别是当前窗口的宽和高*/
 void reshape (int w, int h)
 {
 glViewport (0, 0, (GLsizei) w, (GLsizei) h);
 glMatrixMode (GL_PROJECTION);
 glLoadIdentity ( );
 if (w  2 )
 {
 glBegin( GL_LINES );
 glVertex2fv( contours[contour_cnt].p[0] );
 glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
 contours[contour_cnt].p[point_cnt][0] = -1;
 glEnd();
 glFinish();
 contour_cnt++;
 contours[contour_cnt].point_cnt = 0;
 }
 }
 
/* 处理鼠标响应的函数,根据按键的类型调用不同的函数:左键和中键。 */
 void mouse_clicked( int button, int state, int x, int y )
 {
 /* 将OpenGL的像素坐标换为背景的网格坐标,背景网格为边长为10的小正方形 */
 x -= x%10;
 y -= y%10;
 switch ( button ) {
 case GLUT_LEFT_BUTTON: /* GLUT发现左键被点击 */
 if ( state == GLUT_DOWN ) {
 left_down( x, y );
 }
 break;
 case GLUT_MIDDLE_BUTTON: /* 中键被点击 */
 if ( state == GLUT_DOWN ) {
 middle_down( x, y );
 }
 break;
 }
 }
 /* OpenGL绘制函数,有两种模式 */
 void display( void )
 {
 GLuint i,j;
 GLuint point_cnt;
 
glClear( GL_COLOR_BUFFER_BIT );
 switch ( mode )
 {
 case DEFINE: /* 多边形定义阶段 */
 /* 绘制网格,单个网格大小为10像素,网格数目取决于OpenGL窗口大小 */
 glColor3f ( 0.6, 0.5, 0.5 );
 glBegin ( GL_LINES );
 for ( i = 0 ; i show();
 // 进入消息循环
 return Fl::run();
 }

我们编译、连接并执行程序,就可以得到如图五所示的结果。从上面的例子我们可以看出使用FLTK编写OpenGL程序的一些优点,和GLUT它结构清 晰,使用方便,而且它和GLUT是兼容的。除了glutInit()、glutMainLoop()等少数函数外,大部分GLUT函数可以在FLTK中使 用。FLTK本身也提供了许多OpenGL函数,如绘制字符串的gl_draw()等。

4. 结束语

熟悉掌握了Linux下OpenGL的开发环境距离开发OpenGL程序还有很大的距离,毕竟问题的难点是如何很好的使用OpenGL的API。本文为即将在Linux下开发OpenGL的读者作一些铺垫和准备工作,希望并相信对大家有所帮助。

Mesa下载:ftp://ftp.freedesktop.org/pub/mesa/

转载请标明出处:萝卜根

原文地址请标明:原文地址

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
*

:yund: :yun: :yes: :xiaxia: :xiaom: :xiaohan: :wuyu: :wuxiao: :woshou: :woquan: :wink: :tiaodou: :tiaod: :sikao: :pa: :oops: :ok: :no: :mad: :lihai: :leihua: :lei: :ku: :konghe: :kbu: :jiwai: :jiong: :jiay: :huo: :huaixiao: :hanxiao: :han: :haha: :guolai: :guan: :guai: :ganga: :eek: :dou: :diao: :deng: :buli: :bizui: :bishi: :biggrin: :arrow: