最近在網上發現OpenGL超級寶典已經出了第五版,之前看過第三版,於是將第五版和完整源碼下載下來學習,但驚奇地發現,第五版demo程序已經能夠支持Linux下運行,原來要在Linux安裝開源OpenGL包Mesa及Freeglut纔可以,於是進行了一下嘗試,Mesa安裝成功並且OpneGL的Demo程序已經順利編譯運行,將該過程記錄下來。
/**********************************************************************************************************************************/
原創作品,轉載時請務必以超鏈接形式標明文章原始出處:http://blog.csdn.net/gqb666/article/details/8994789,作者:gqb666/**********************************************************************************************************************************/
一、安裝Mesa及Freeglut開源包:
使用如下命令即可完成Mesa包及freeglut包的安裝:
sudo apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev mesademos
注意:可能mesademos包無法下載下來,另外一種安裝的方法是從官網把上面的源碼包下載下來自行編譯安裝,效果一樣的。
二、Linux下使用OpenGL超級寶典第五版Demo程序:
可以從地址:http://download.csdn.net/detail/gqb666/5670371 下載OpenGL超級寶典英文第五版及完整源代碼,然後將源代碼解壓後會看到Linux和Src兩個與本文相關的目錄。本文以Chapter05中的Pyramid爲例來說明使用方法。
進入目錄:Linux/Chapter05/Pyramid,裏面有Makefile及用作紋理tga格式的圖片。Makefile的內容如下:
MAIN = Pyramid
SRCPATH = ../../../Src/Chapter05/$(MAIN)/
SHAREDPATH = ../../../Src/GLTools/src/
SHAREDINCPATH = ../../../Src/GLTools/include/
LIBDIRS = -L/usr/X11R6/lib -L/usr/X11R6/lib64 -L/usr/local/lib
INCDIRS = -I/usr/include -I/usr/local/include -I/usr/include/GL -I$(SHAREDINCPATH) -I$(SHAREDINCPATH)GL
CC = g++
CFLAGS = $(COMPILERFLAGS) -g $(INCDIRS)
LIBS = -lX11 -lglut -lGL -lGLU -lm
prog : $(MAIN)
$(MAIN).o : $(SRCPATH)$(MAIN).cpp
glew.o : $(SHAREDPATH)glew.c
GLTools.o : $(SHAREDPATH)GLTools.cpp
GLBatch.o : $(SHAREDPATH)GLBatch.cpp
GLTriangleBatch.o : $(SHAREDPATH)GLTriangleBatch.cpp
GLShaderManager.o : $(SHAREDPATH)GLShaderManager.cpp
math3d.o : $(SHAREDPATH)math3d.cpp
$(MAIN) : $(MAIN).o glew.o
$(CC) $(CFLAGS) -o $(MAIN) $(LIBDIRS) $(SRCPATH)$(MAIN).cpp $(SHAREDPATH)glew.c $(SHAREDPATH)GLTools.cpp
$(SHAREDPATH)GLBatch.cpp $(SHAREDPATH)GLTriangleBatch.cpp $(SHAREDPATH)GLShaderManager.cpp
$(SHAREDPATH)math3d.cpp $(LIBS)
clean:
rm -f *.o
該Makefile使用到了Src目錄下的文件。依次執行命令
$make clean
$make
會生成新的可執行文件Pyramid,我們執行Pyramid後就可以看到使用紋理貼圖效果的金字塔了,如下圖:
三、另附一段Linux下可編譯運行的OpenGL代碼:
/* sphere.c
此程序利用GLUT繪製一個OpenGL窗口,並顯示一個加以光照的球。
*/
/* 由於頭文件glut.h中已經包含了頭文件gl.h和glu.h,所以只需要include 此文件*/
# include<GL/glut.h>
# include<stdlib.h>
/* 初始化材料屬性、光源屬性、光照模型,打開深度緩衝區 */
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 <= h)
glOrtho(-1.5, 1.5, -1.5 * ( GLfloat )h/( GLfloat )w, 1.5 * ( GLfloat )h / ( GLfloat )w, -10.0, 10.0);
else
glOrtho(-1.5 * ( GLfloat )w / ( GLfloat )h, 1.5 * ( GLfloat )w / ( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
/* 定義對鍵盤的響應函數 */
void keyboard(unsigned char key, int x, int y)
{
/*按Esc鍵退出*/
switch(key)
{
case 27:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
/* GLUT環境初始化*/
glutInit(&argc, argv);
/* 顯示模式初始化 */
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
/* 定義窗口大小 */
glutInitWindowSize(300, 300);
/* 定義窗口位置 */
glutInitWindowPosition(100, 100);
/* 顯示窗口,窗口標題爲執行函數名 */
glutCreateWindow(argv[0]);
/* 調用OpenGL初始化函數 */
init();
/* 註冊OpenGL繪圖函數 */
glutDisplayFunc(display);
/* 註冊窗口大小改變時的響應函數 */
glutReshapeFunc(reshape);
/* 註冊鍵盤響應函數 */
glutKeyboardFunc(keyboard);
/* 進入GLUT消息循環,開始執行程序 */
glutMainLoop();
return 0;
}
編譯運行方法:
gcc sphere.c -o sphere -lglut
./sphere
四、附上Fedora 15下安裝mesa的方法:
安裝opengl,需要輸入命令行:
yum list mesa* (mesa是fedora下openGL的實現,是基本庫)
yum install mesa* (安裝mesa*)
yum list *glut* (是openGL的一個輔助庫,可用它創建與平臺無關的openGL窗口)
yum install freeglut* (選擇其中一個安裝)