一、初始化
void glutInit(int* argc,char** argv)
這個(gè)函數(shù)用來(lái)初始化GLUT庫(kù)。對(duì)應(yīng)main函數(shù)的形式應(yīng)是:int main(int argc,char* argv[]);
這個(gè)函數(shù)從main函數(shù)獲取其兩個(gè)參數(shù)。
void glutInitWindowSize(int width,int height); void glutInitWindowPosition(int x,int y);
設(shè)置glut程序要產(chǎn)生的窗口的大小和位置(左上角)。以像素為單位。
void glutInitDisplayMode(unsigned int mode);
設(shè)置圖形顯示模式。參數(shù)mode的可選值為:
- GLUT_RGBA:當(dāng)未指明GLUT-RGBA或GLUT-INDEX時(shí),是默認(rèn)使用的模式。表明欲建立RGBA模式的窗口。
- GLUT_RGB:與GLUT-RGBA作用相同。
- GLUT_INDEX:指明為顏色索引模式。
- GLUT_SINGLE:只使用單緩存
- GLUT_DOUBLE:使用雙緩存。以避免把計(jì)算機(jī)作圖的過(guò)程都表現(xiàn)出來(lái),或者為了平滑地實(shí)現(xiàn)動(dòng)畫。
- GLUT_ACCUM:讓窗口使用累加的緩存。
- GLUT_ALPHA:讓顏色緩沖區(qū)使用alpha組件。
- GLUT_DEPTH:使用深度緩存。
- GLUT_STENCIL:使用模板緩存。
- GLUT_MULTISAMPLE:讓窗口支持多例程。
- GLUT_STEREO:使窗口支持立體。
- GLUT_LUMINACE:luminance是亮度的意思。但是很遺憾,在多數(shù)OpenGL平臺(tái)上,不被支持。
二、事件處理(Event Processing)
void glutMainLoop(void)
讓glut程序進(jìn)入事件循環(huán)。在一個(gè)glut程序中最多只能調(diào)用一次。一旦調(diào)用,會(huì)直到程序結(jié)束才返回。
三、窗口管理(Window Management)
int glutCreateWindow(char* name);
產(chǎn)生一個(gè)頂層的窗口。name 作為窗口的名字,也就是窗口標(biāo)題欄顯示的內(nèi)容。
返回值是生成窗口的標(biāo)記符,可用函數(shù)glutGetWindow()加以引用。
int glutCreateSubWindow(int win,int x,int y,int width,int height);
創(chuàng)建一個(gè)子窗口。win是其父窗口的標(biāo)記符。x,y是相對(duì)父窗口的位移,以像素表示。
width,height是子窗口的寬和高。
void glutSetWindow(int win); int glutGetWindow(void);
功能分別是:設(shè)置標(biāo)記符為win的窗口為當(dāng)前窗口;返回當(dāng)前窗口的標(biāo)記符。
void glutDestroyWindow(int win);
銷毀以win標(biāo)記的窗口。
void glutPostRedisplay(void);
將當(dāng)前窗口打上標(biāo)記,標(biāo)記其需要再次顯示。
void glutSwapBuffers(void);
當(dāng)窗口模式為雙緩存時(shí),此函數(shù)的功能就是把后臺(tái)緩存的內(nèi)容交換到前臺(tái)顯示。當(dāng)然,只有單緩存時(shí),使用它的功能跟用glFlush()一樣。
而使用雙緩存是為了把完整圖畫一次性顯示在窗口上,或者是為了實(shí)現(xiàn)動(dòng)畫。
void glutPositionWindow(int x,int y);
改變當(dāng)前窗口的位置:當(dāng)前窗口是頂層窗口時(shí),x,y是相對(duì)于屏幕的的位移;當(dāng)前窗口若是子窗口時(shí),x,y是相對(duì)其父窗口原點(diǎn)的位移。
void glutReshapeWindow(int width,int height);
改變當(dāng)前窗口的大小。
width,height是當(dāng)前窗口新的寬度和高度值,當(dāng)然只能是正值。
void glutFullscreen(void);
讓當(dāng)前窗口全屏顯示。當(dāng)前窗口是頂層窗口時(shí)才有效。
void glutPopWindow(void); void glutPushWindow(void);
對(duì)頂層窗口和子窗口均有效。改變當(dāng)前窗口在棧中相對(duì)于其它窗口的次序。
void glutShowWindow(void); void glutHideWindow(void); void glutIconifyWindow(void);
這三個(gè)函數(shù)作用是改變當(dāng)前窗口的顯示狀態(tài)。
- glutShowWindow讓當(dāng)前窗口可視(這時(shí)它還是可能被其它窗口擋住)。
- glutHideWindow讓當(dāng)前窗口成為不可視狀態(tài)。
- glutIconifyWindow讓當(dāng)前窗口成為一個(gè)圖標(biāo),也即是最小化。
void glutSetWindowTitle(char* name); void glutSetIconTitle(char* name);
設(shè)置當(dāng)前窗口(必須是頂層窗口)的標(biāo)題和圖標(biāo)化時(shí)的標(biāo)題。
void glutSetCursor(int cursor);
設(shè)置當(dāng)前窗口的光標(biāo)樣式。
cursor可選值有許多:如GLUT_CURSOR_RIGHT_ARROW指向右邊的光標(biāo),GLUT_CURSOR_LEFT_ARROW指向左邊的光標(biāo),GLUT_CURSOR_INFO成為手狀。 GLUT_CURSOR_DESTROY呈叉狀,GLUT_CURSOR_HELP呈現(xiàn)問號(hào)的形狀。等等。
四、窗口的覆蓋管理
void glutEstablishOverlay(void);
對(duì)當(dāng)前窗口創(chuàng)建覆蓋圖層。該覆蓋圖的模式由初始化顯示模式函數(shù)glutDisplayMode()決定。
glutLayerGet(GLUT_OVERLAY_POSSIBLE)可用以設(shè)置對(duì)于當(dāng)前窗口,是否允許產(chǎn)生由初始化顯示模式函數(shù)規(guī)定其模式的覆蓋圖層。
void glutUserLayer(GLenum layer);
枚舉量layer可選值為:GLUT_NORMAL,GLUT_OVERLAY.分別選取正常位平面或覆蓋平面。
void glutRemoveLayer(void);
除去覆蓋圖。當(dāng)沒有覆蓋圖層時(shí),調(diào)用這條語(yǔ)句也是安全的,這時(shí)系統(tǒng)不做任何事。
void glutPostOverlayRedisplay(void);
標(biāo)記該覆蓋圖層為需要重新顯示的狀態(tài)。
void glutShowOverlay(void); void glutHideOverlay(void);
顯示當(dāng)前窗口的覆蓋圖層;隱藏覆蓋圖層。這兩條語(yǔ)句即時(shí)執(zhí)行。注意一下,只有窗口可視時(shí),使用glutShowOverlay才能使其覆蓋圖層可視。當(dāng)窗口被其他窗口遮擋時(shí),其覆蓋圖層也被遮擋從而不可視。
五、菜單管理
int glutCreateMenu(void (*func)(int value))
當(dāng)點(diǎn)擊菜單時(shí),調(diào)用回調(diào)函數(shù)func,value為傳遞給回調(diào)函數(shù)的數(shù)值,它由所選擇的菜單條目對(duì)應(yīng)的整數(shù)值所決定。
這個(gè)函數(shù)創(chuàng)建一個(gè)新的彈出式菜單,并返回一個(gè)唯一的標(biāo)識(shí)次菜單的整型標(biāo)識(shí)符,并將新建的彈出菜單與func函數(shù)關(guān)聯(lián)在一起,這樣,當(dāng)選擇此菜單中的一個(gè)菜單條目時(shí),調(diào)用回調(diào)函數(shù)func.
void glutSetMenu(int menu); int glutGetMenu(void);
設(shè)置當(dāng)前菜單;獲取當(dāng)前菜單的標(biāo)識(shí)符
void glutDestroyMenu(int menu);
刪除指定的菜單
void glutAddMenuEntry(char* name, int value);
添加一個(gè)菜單條目
void glutAddSubMenu(char* name, int menu);
在當(dāng)前菜單的底部增加一個(gè)子菜單的觸發(fā)條目
void glutChangeToMenuEntry(int entry, char* name, int value);
更改當(dāng)前菜單中指定菜單項(xiàng)
void glutChangeToSubMenu(int entry, char* name, int menu);
將指定的當(dāng)前菜單中菜單項(xiàng)變?yōu)樽硬藛斡|發(fā)條目
void glutRemoveMenuItem(int entry);
刪除指定的菜單項(xiàng)
void glutAttachMenu(int button); void glutDetachMenu(int button);
把當(dāng)前窗口的一個(gè)鼠標(biāo)按鍵與當(dāng)前菜單關(guān)聯(lián)起來(lái);解除鼠標(biāo)按鍵與彈出式菜單的關(guān)聯(lián)關(guān)系
六、注冊(cè)回調(diào)
void glutDisplayFunc(void (*func)(void) );
為當(dāng)前窗口設(shè)置顯示回調(diào)函數(shù)
void glutOverlayDisplayFunc(void (*func)(void) );
注冊(cè)當(dāng)前窗口的重疊層的顯示回調(diào)函數(shù)
void glutReshapeFunc(void (*Func)(int width, int height) );
指定當(dāng)窗口的大小改變時(shí)調(diào)用的函數(shù)
void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y) );
注冊(cè)當(dāng)前窗口的鍵盤回調(diào)函數(shù)
void glutMouseFunc(void (*func) (int button, int state, int x, int y));
注冊(cè)當(dāng)前窗口的鼠標(biāo)回調(diào)函數(shù)
func為注冊(cè)的鼠標(biāo)回調(diào)函數(shù),這個(gè)函數(shù)完成鼠標(biāo)事件的處理
button為鼠標(biāo)的按鍵,為以下定義的常量
GLUT_LEFT_BUTTON |
鼠標(biāo)左鍵 |
GLUT_MIDDLE_BUTTON |
鼠標(biāo)中鍵 |
GLUT_RIGHT_BUTTON |
鼠標(biāo)右鍵 |
state為鼠標(biāo)按鍵的動(dòng)作,為以下定義的常量
GLUT_UP |
鼠標(biāo)釋放 |
GLUT_DOWN |
鼠標(biāo)按下 |
x,y為鼠標(biāo)按下式,光標(biāo)相對(duì)于窗口左上角的位置
void glutMotionFunc(void (*func)(int x, int y)); void glutPassiveMotionFunc(void (*func)(int x, int y));
設(shè)置移動(dòng)回調(diào)函數(shù);設(shè)置當(dāng)前鼠標(biāo)移動(dòng)函數(shù)
Func為注冊(cè)的鼠標(biāo)移動(dòng)函數(shù)
x,y為鼠標(biāo)按下式,光標(biāo)相對(duì)于窗口左上角的位置 當(dāng)鼠標(biāo)在窗口中按下并移動(dòng)時(shí)調(diào)用glutMotionFunc注冊(cè)的回調(diào)函數(shù) 當(dāng)鼠標(biāo)在窗口中移動(dòng)時(shí)調(diào)用glutPassiveMotionFunc注冊(cè)的回調(diào)函數(shù)
void glutVisibilityFunc(void (*func) (int state) );
設(shè)置當(dāng)前窗口的可視回調(diào)函數(shù)
Func為指定的可視回調(diào)函數(shù)
state表示窗口的可視性,為以下常量:
GLUT_NOT_VISIBLE |
窗口完全不可見 |
GLUT_VISIBLE |
窗口可見或部分可見 |
這個(gè)函數(shù)設(shè)置當(dāng)前窗口的可視回調(diào)函數(shù),當(dāng)窗口的可視性改變時(shí),該窗口的可視回調(diào)函數(shù)被調(diào)用.只要窗口中的任何一個(gè)像素是可見的,或者他的任意一個(gè)子窗口中任意一個(gè)像素是可見的,GLUT則認(rèn)為窗口是可見的.
void glutEntryFunc(void (*func) (int state));
設(shè)置鼠標(biāo)的進(jìn)出窗口的回調(diào)函數(shù)
Func為注冊(cè)的鼠標(biāo)進(jìn)出回調(diào)函數(shù)
state為鼠標(biāo)的進(jìn)出狀態(tài),為以下常量之一:
GLUT_LEFT |
鼠標(biāo)離開窗口 |
GLUT_RIGHT |
鼠標(biāo)進(jìn)入窗口 |
當(dāng)窗口取得焦點(diǎn)或失去焦點(diǎn)時(shí)調(diào)用這個(gè)函數(shù),當(dāng)鼠標(biāo)進(jìn)入窗口區(qū)域并點(diǎn)擊時(shí),state為GLUT_RIGHT,當(dāng)鼠標(biāo)離開窗口區(qū)域點(diǎn)擊其他窗口時(shí),state為GLUT_LEFT.
void glutSpecialFunc(void (*func) (int key, int x, int y))
設(shè)置當(dāng)前窗口的特定鍵的回調(diào)函數(shù)
Func為注冊(cè)的特定鍵的回調(diào)函數(shù)
key為按下的特定鍵,為以下定義的常量:
key常量 |
描述 |
GLUT_KEY_F1 |
F1功能鍵 |
GLUT_KEY_F2 |
F2功能鍵 |
GLUT_KEY_F3 |
F3功能鍵 |
GLUT_KEY_F4 |
F4功能鍵 |
GLUT_KEY_F5 |
F5功能鍵 |
GLUT_KEY_F6 |
F6功能鍵 |
GLUT_KEY_F7 |
F7功能鍵 |
GLUT_KEY_F8 |
F8功能鍵 |
GLUT_KEY_F9 |
F9功能鍵 |
GLUT_KEY_F10 |
F10功能鍵 |
GLUT_KEY_F11 |
F11功能鍵 |
GLUT_KEY_F12 |
F12功能鍵 |
GLUT_KEY_LEFT |
左方向鍵 |
GLUT_KEY_UP |
上方向鍵 |
GLUT_KEY_RIGHT |
右方向鍵 |
GLUT_KEY_DOWN |
下方向鍵 |
GLUT_KEY_PAGE_UP |
PageUp鍵 |
GLUT_KEY_PAGE_DOWN |
PageDown鍵 |
GLUT_KEY_HOME |
Home鍵 |
GLUT_KEY_END |
End鍵 |
GLUT_KEY_INSERT |
Insert鍵 |
x,y為當(dāng)按下鍵時(shí)鼠標(biāo)的坐標(biāo),相對(duì)于窗口左上角,以像素為單位 注意:ESC,回車和delete鍵由ASCII碼產(chǎn)生.
void glutMenuStatusFunc(void (*func) (int status, int x, int y));
設(shè)置菜單狀態(tài)回調(diào)函數(shù)
func是注冊(cè)的菜單狀態(tài)回調(diào)函數(shù)
status是當(dāng)前是否使用菜單,為以下定義的常量
GLUT_MENU_IN_USE |
菜單正在使用 |
GLUT_MENU_NOT_IN_USE |
菜單未被使用 |
x,y是鼠標(biāo)按下式,光標(biāo)相對(duì)于窗口左上角的位置
這個(gè)函數(shù)時(shí)glut程序判定是否正在使用菜單,當(dāng)彈出菜單時(shí),調(diào)用注冊(cè)的菜單狀態(tài)回調(diào)函數(shù),同時(shí)status設(shè)置為常量GLUT_MENU_IN_USE, 當(dāng)菜單使用完畢時(shí),也調(diào)用菜單狀態(tài)回調(diào)函數(shù),此時(shí)status變量變?yōu)?span lang="EN-US">GLUT_MENU_NOT_IN_USE.從已彈出的菜單中再?gòu)棾龅牟藛尾划a(chǎn)生菜單狀態(tài)回調(diào)過(guò)程.每個(gè)glut程序只有一個(gè)菜單狀態(tài)回調(diào)函數(shù).
glutSpaceballRotateFunc
glutSpaceballButtonFunc
glutButtonBoxFunc
glutDialsFunc
glutTabletMotionFunc
glutTabletButtonFunc
void glutMenuStatusFunc(void (*func) (int status, int x, int y));
設(shè)置菜單狀態(tài)回調(diào)函數(shù)
func為注冊(cè)的菜單狀態(tài)回調(diào)函數(shù)
status表示當(dāng)前是否使用菜單,為以下定義的常量
GLUT_MENU_IN_USE |
菜單正在使用 |
GLUT_MENU_NOT_IN_USE |
菜單未被使用 |
x,y表示鼠標(biāo)按下式,光標(biāo)相對(duì)于窗口左上角的位置
這個(gè)函數(shù)時(shí)glut程序判定是否正在使用菜單,當(dāng)彈出菜單時(shí),調(diào)用注冊(cè)的菜單狀態(tài)回調(diào)函數(shù),同時(shí)status設(shè)置為常量GLUT_MENU_IN_USE, 當(dāng)菜單使用完畢時(shí),也調(diào)用菜單狀態(tài)回調(diào)函數(shù),此時(shí)status變量變?yōu)?span lang="EN-US">GLUT_MENU_NOT_IN_USE.從已彈出的菜單中再?gòu)棾龅牟藛尾划a(chǎn)生菜單狀態(tài)回調(diào)過(guò)程.每個(gè)glut程序只有一個(gè)菜單狀態(tài)回調(diào)函數(shù).
void glutIdleFunc(void (*func) (void));
設(shè)置空閑回調(diào)函數(shù)
func表示當(dāng)系統(tǒng)空閑時(shí)調(diào)用的函數(shù),它的形式為void func(void)
void glutTimerFunc(unsigned int msecs, void (*Func)(int value), int value);
注冊(cè)一個(gè)回調(diào)函數(shù),當(dāng)指定時(shí)間值到達(dá)后,由GLUT調(diào)用注冊(cè)的函數(shù)一次
msecs是等待的時(shí)間
Func是注冊(cè)的函數(shù)
value是指定的一個(gè)數(shù)值,用來(lái)傳遞到回調(diào)函數(shù)Func中
這個(gè)函數(shù)注冊(cè)了一個(gè)回調(diào)函數(shù),當(dāng)指定的毫秒數(shù)到達(dá)后,這個(gè)函數(shù)就調(diào)用注冊(cè)的函數(shù),value參數(shù)用來(lái)向這個(gè)注冊(cè)的函數(shù)中傳遞參數(shù). |