详细介绍在ArchLinux下安装配置OpenGL的过程。
1 前言
在Linux安装配置OpenGL理论上是一件非常轻松的事情,因为OpenGL本身就是跨平台的东西。但我在看 OpenGL SuperBible 4th Edition 的时候,却总是遇到一些让我郁闷的事情:自带的GLTools类包只能在Windows和Mac OSX下使用,而且还得自己写Makefile。后来到网上找解决方法,才发现 SuperBible 已经早已经出到了 5th Edition,并且加入了对Linux的支持。 --bbb
这给我两大教训:
- 当书中的内容有所欠缺的时候,应该及时去看官网,看看有没有发布新的版本,而不是自己在一旁摸索解决方法。
- 不要总指望网上能够下载到电子版本,能够下载的大多数是Out of Date的。于是我索性网购了一本纸质版 1 1其实我喜欢电子版本的原因是可以方便的复制书中的内容,这对我做笔记很有用。另外由于电脑屏幕够大,所以在Awesome下可以直接开Emacs和evince两个窗口,一边看书一边动手,非常顺手。。
2 安装 OpenGL
将第五版书中的代码下载下来:
1
| $ svn checkout http://oglsuperbible5.googlecode.com/svn/trunk/ oglsuperbible5-read-only
|
得到如下的目录树:
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
| oglsuperbible5-read-only/ # OpenGL SuperBible 5th Edition 代码包 | +-- freeglut-2.6.0/ # freeglut 安装包 | +-- Linux/ # Linux Makefile 工程文件 | | | +---- Chap01/ | | | | | +---- Block/ | | | | | +---- Makefile # Block 程序的Makefile | | | +---- ... | | | +-- Src/ # 源代码 | | | +---- Chap01/ | | | | | +---- Block/ | | | | | +---- Block.cpp # Block 程序源文件 | | | +---- ... | | | | | +---- GLTools/ # GLTools工具包 | | | | | +---- include/ # 头文件 | | | | | | | +---- GL/ | | | | | | | +---- GLTools.h # GLTools头文件 | | | | | | | +---- math3d.h # 矩阵类头文件 | | | | | | | +---- ... | | | | | +---- src/ # 源文件 | | | | | +---- GLTools.cpp # GLTools头文件 | | | | | +---- math3d.cpp # 矩阵类源文件 | | | | | +---- ... | | | +---- Models/ | | | +---- OpenEXR/ | +-- VisualStudio2008/ # VisualStudio 2008 工程文件 | +-- VisualStudio2010/ # VisualStudio 2010 工程文件 | +-- XCode/ # XCode 工程文件
|
可以看到开发OpenGL必须的freeglut包已经给出,进入该目录内安装freeglut:
1 2 3 4
| $ cd oglsuperbible5-read-only/freeglut-2.6.0 $ ./autogen.sh $ ./configure $ make
|
完成后,建议把帮助文档也装上:
1
| $ pacman -S opengl-man-pages
|
这样,当需要获取帮助的时候,可以直接使用man查询,例如要查看 glVertex
函数的帮助,可以:
3 编译示例程序
要编译代码包提供的示例程序,直接在 Linux
目录下找到相应的工程Makefile,然后 make
编译即可。关于Makefile的规则,推荐阅读陈皓编写的《跟我一起写Makefile》。
4 不用写Makefile也能编译
如果是自己编写的源文件,每次都要写一个Makefile显得太过繁琐,这里给出一个方法3,可以让你不用编写Makefile即可直接编译程序。
将下面的代码保存为一个脚本 opengl :
1 2
| #!/bin/sh g++ $1 -I GLTools/include/GL -I GLTools/include/ -I GLTools/src/ -I /usr/include -I /usr/local/include -I /usr/include -L /usr/X11R6/lib -L /usr/X11R6/lib64 -L /usr/local/lib -lX11 -lglut -lGL -lGLU -lm -o ${1%.*}
|
保存后,赋予它执行权限:
可以看到脚本中引用了几个目录中的文件,所以需要将代码包中的 Src
目录下的 GLTools 目录拷贝到这个文件夹中来,即保证你的目录树是这样的:
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
| program | +---- GLTools/ # GLTools工具包 | | | +---- include/ # 头文件 | | | | | +---- GL/ | | | | | +---- GLTools.h # GLTools头文件 | | | | | +---- math3d.h # 矩阵类头文件 | | | | | +---- ... | | | +---- src/ # 源文件 | | | +---- GLTools.cpp # GLTools头文件 | | | +---- math3d.cpp # 矩阵类源文件 | | | +---- ... | +---- opengl # opengl脚本 | +---- ... # 你编写的源文件(*.cpp)
|
然后就可以同个文件夹下编写程序,要保证每个程序的头部引入必要的头文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <GLTools.h> #include <GLShaderManager.h> #include <GLFrustum.h> #include <GLBatch.h> #include <GLMatrixStack.h> #include <GLGeometryTransform.h> #include <StopWatch.h> #include <glew.c> #include <GLTools.cpp> #include <GLShaderManager.cpp> #include <GLBatch.cpp> #include <GLTriangleBatch.cpp> #include <math3d.cpp> #include <math.h> #include <stdio.h> #include <StopWatch.h> #ifdef __APPLE__ #include <glut/glut.h> #else #define FREEGLUT_STATIC #include <GL/glut.h> #endif
|
编写完后,使用下面的命令编译程序:
5 glut弹出菜单无法显示?
如果遇到 glutCreateMenu
函数生成的弹出菜单无法显示的问题,可能是freeglut的版本太高的原因。我一开始是使用yaourt命令安装freeglut的,安装的版本是2.8.0,就存在这个问题。
解决的方法就是downgrade之:
1 2
| $ wget http://arm.konnichi.com/extra/os/{i686|x86_64}/freeglut-2.6.0-1-{i686|x86_64}.pkg.tar.gz $ pacman -U ./freeglut-2.6.0-1-{i686|x86_64}.pkg.tar.gz
|