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