王繼東等
王繼東龐明勇李建生
摘要:介紹了GLUT的設(shè)計原理和功能,闡述了基于GLUT構(gòu)建OpenGL應(yīng)用程序框架的步驟。并給出一個具體的應(yīng)用程序?qū)嵗?/p>
關(guān)鍵詞:GLUTOpenGL應(yīng)用程序框架
1GLUT設(shè)計原理與功能
GLUT是用ANSI C和FORTRAN語言實現(xiàn)的一個編程接口,其API是獨(dú)立于窗口系統(tǒng)的,所以它不返回任何活動的窗口句柄、指針及其他數(shù)據(jù)結(jié)構(gòu)。GLUT簡化了應(yīng)用OpennGL渲染的過程,通過GLUT的API只需簡單的幾步就能為OpenGL創(chuàng)建一個可供渲染的窗口。它的設(shè)計和OpennGL一樣也是基于狀態(tài)機(jī)的,當(dāng)前窗口和當(dāng)前菜單是GLUT兩個最重要的狀態(tài),OpenGL中的函數(shù)一般只作用于這些狀態(tài)綁定的窗口。根據(jù)簡單應(yīng)用程序的一般要求,GLUT合理地預(yù)定義了大部分的初始狀態(tài),從而簡化了狀態(tài)設(shè)置過程。
GLUT提供的功能包括多窗口OpenGL渲染、回調(diào)模式驅(qū)動的程序執(zhí)行方式、完整的輸入設(shè)備、提供系統(tǒng)閑置時調(diào)用的idle函數(shù)、提供彈出式菜單、提供常用的線框和實體模型的繪制、支持圖像/圖形字體的繪制、其它的窗口管理功能(包括管理重疊層)等,這些功能基本滿足了OpenGL圖形應(yīng)用程序開發(fā)的需要。
2基于GLUT構(gòu)建OpenGL應(yīng)用程序框架的方法
基于GLUT構(gòu)建OpenGL的應(yīng)用程序框架可以按照以下幾個步驟進(jìn)行:
(1)初始化和創(chuàng)建窗口。在任何GLUT子程序之前,應(yīng)首先調(diào)用能夠處理命令行選項的gutlnit()函數(shù)對GLUT庫進(jìn)行初始化,然后,再調(diào)用glutInitDisplayMode()、glu-tlnitWindowSize()、glutInitWindowPosition()對窗口的顯示模式、大小以及窗口在屏幕中的位置進(jìn)行設(shè)置,最后,調(diào)用gutCreateWindow()函數(shù)創(chuàng)建新窗口;(2)設(shè)置OoenGL初始狀態(tài)。一般在窗口創(chuàng)建成功后,我們將要對OpenGL初始狀態(tài)進(jìn)行設(shè)置。如使用glColor*()函數(shù)設(shè)置當(dāng)前顏色,使用glLingIlt*()函數(shù)設(shè)置光源屬性,使用gIBlendFunc()函數(shù)設(shè)置混合操作,使用glEnable()和glDisable()函數(shù)激活和關(guān)閉各種狀態(tài)開關(guān)等;(3)注冊回調(diào)函數(shù)。在程序進(jìn)入主循環(huán)之前,應(yīng)對回調(diào)函數(shù)進(jìn)行0注冊。常用的注冊回調(diào)函數(shù)有:glutDisplayFunc()函數(shù)、glutReshapeFunc()函數(shù)、glutKeyboardFunc()函數(shù)、glutSpecialFunc()函數(shù)、glutInit()函數(shù)。(4)進(jìn)入GLUT事件處理循環(huán)。在完成前面所有設(shè)置后,就可以通過glutMainLoop()函數(shù)進(jìn)入GLUT事件處理循環(huán)。當(dāng)某事件被激活,應(yīng)用程序?qū)⒄{(diào)用相應(yīng)的已注冊回調(diào)函數(shù)實現(xiàn)特定的功能,如窗口重繪、鍵盤交互、鼠標(biāo)交互等。
3應(yīng)用程序?qū)嵗?/p>
在Windows2000和VC6.0環(huán)境下,建立一個基于GLUT的簡單OpenGL程序?qū)嵗?。實例主要是繪制一個半透明紋理的正方體,并可以使用鍵盤上的Home鍵和方向鍵控制正方體旋轉(zhuǎn)。
3.1 Include文件及程序庫鏈接設(shè)置
把glut.h、glut32.1ib文件復(fù)制到VC6.0程序文件夾下的子文件夾中(glut.h復(fù)制到Microsoft Visual Stu-dioVC98IncludeGL,glut32.1ib復(fù)制到Microsoft VisualStudioVC98Lib),把glut32.dll復(fù)制到操作系統(tǒng)所在文件夾的子文件夾中(一般為WlNNTsystem32)。
打開VC6.0建立一個空的Win32控制臺程序并新建一個C++源文件。在C++源文件的開始處,除了包含其他必要頭文件以外還必須包含GLUT頭文件,代碼為:#in-elude
程序庫的鏈接可以通過VC6.0的菜單選項“Project->settings”設(shè)置,不過這里我們使用更加靈活方便的命令行完成,這樣在Debug模式與Release模式之間切換時就不會出錯。代碼如下:
3.2程序主函數(shù)的編寫
基于GLUT的OpenGL應(yīng)用程序框架主要在main()函數(shù)中構(gòu)建,代碼如下:
3.3 OpenGL繪制與交互
4結(jié)束語
開發(fā)者使用GLUT能夠在不考慮開發(fā)平臺的基礎(chǔ)上直接進(jìn)行OpenGL圖形開發(fā),提高了應(yīng)用程序的開發(fā)效率降低了開發(fā)的門檻。