一、初始化
void glutInit(int* argc,char** argv)
這個函數用來初始化GLUT庫。對應main函數的形式應是:int main(int argc,char* argv[]);
這個函數從main函數擷取其兩個參數。
void glutInitWindowSize(int width,int height);
void glutInitWindowPosition(int x,int y);
設定glut程式要産生的視窗的大小和位置(左上角)。以像素為機關。
void glutInitDisplayMode(unsigned int mode);
設定圖形顯示模式。參數mode的可選值為:
- GLUT_RGBA:當未指明GLUT-RGBA或GLUT-INDEX時,是預設使用的模式。表明欲建立RGBA模式的視窗。
- GLUT_RGB:與GLUT-RGBA作用相同。
- GLUT_INDEX:指明為顔色索引模式。
- GLUT_SINGLE:隻使用單緩存
- GLUT_DOUBLE:使用雙緩存。以避免把計算機作圖的過程都表現出來,或者為了平滑地實作動畫。
- GLUT_ACCUM:讓視窗使用累加的緩存。
- GLUT_ALPHA:讓顔色緩沖區使用alpha元件。
- GLUT_DEPTH:使用深度緩存。
- GLUT_STENCIL:使用模闆緩存。
- GLUT_MULTISAMPLE:讓視窗支援多例程。
- GLUT_STEREO:使視窗支援立體。
- GLUT_LUMINACE:luminance是亮度的意思。但是很遺憾,在多數OpenGL平台上,不被支援。
二、事件處理(Event Processing)
void glutMainLoop(void)
讓glut程式進入事件循環。在一個glut程式中最多隻能調用一次。一旦調用,會直到程式結束才傳回。
三、視窗管理(Window Management)
int glutCreateWindow(char* name);
産生一個頂層的視窗。name 作為視窗的名字,也就是視窗标題欄顯示的内容。
傳回值是生成視窗的标記符,可用函數glutGetWindow()加以引用。
int glutCreateSubWindow(int win,int x,int y,int width,int height);
建立一個子視窗。win是其父視窗的标記符。x,y是相對父視窗的位移,以像素表示。
width,height是子視窗的寬和高。
void glutSetWindow(int win);
int glutGetWindow(void);
功能分别是:設定标記符為win的視窗為目前視窗;傳回目前視窗的标記符。
void glutDestroyWindow(int win);
銷毀以win标記的視窗。
void glutPostRedisplay(void);
将目前視窗打上标記,标記其需要再次顯示。
void glutSwapBuffers(void);
當視窗模式為雙緩存時,此函數的功能就是把背景緩存的内容交換到前台顯示。當然,隻有單緩存時,使用它的功能跟用glFlush()一樣。
而使用雙緩存是為了把完整圖畫一次性顯示在視窗上,或者是為了實作動畫。
void glutPositionWindow(int x,int y);
改變目前視窗的位置:目前視窗是頂層視窗時,x,y是相對于螢幕的的位移;目前視窗若是子視窗時,x,y是相對其父視窗原點的位移。
void glutReshapeWindow(int width,int height);
改變目前視窗的大小。
width,height是目前視窗新的寬度和高度值,當然隻能是正值。
void glutFullscreen(void);
讓目前視窗全屏顯示。目前視窗是頂層視窗時才有效。
void glutPopWindow(void);
void glutPushWindow(void);
對頂層視窗和子視窗均有效。改變目前視窗在棧中相對于其它視窗的次序。
void glutShowWindow(void);
void glutHideWindow(void);
void glutIconifyWindow(void);
這三個函數作用是改變目前視窗的顯示狀态。
- glutShowWindow讓目前視窗可視(這時它還是可能被其它視窗擋住)。
- glutHideWindow讓目前視窗成為不可視狀态。
- glutIconifyWindow讓目前視窗成為一個圖示,也即是最小化。
void glutSetWindowTitle(char* name);
void glutSetIconTitle(char* name);
設定目前視窗(必須是頂層視窗)的标題和圖示化時的标題。
void glutSetCursor(int cursor);
設定目前視窗的光标樣式。
cursor可選值有許多:如GLUT_CURSOR_RIGHT_ARROW指向右邊的光标,GLUT_CURSOR_LEFT_ARROW指向左邊的光标,GLUT_CURSOR_INFO成為手狀。
GLUT_CURSOR_DESTROY呈叉狀,GLUT_CURSOR_HELP呈現問号的形狀。等等。
四、視窗的覆寫管理
void glutEstablishOverlay(void);
對目前視窗建立覆寫圖層。該覆寫圖的模式由初始化顯示模式函數glutDisplayMode()決定。
glutLayerGet(GLUT_OVERLAY_POSSIBLE)可用以設定對于目前視窗,是否允許産生由初始化顯示模式函數規定其模式的覆寫圖層。
void glutUserLayer(GLenum layer);
枚舉量layer可選值為:GLUT_NORMAL,GLUT_OVERLAY.分别選取正常位平面或覆寫平面。
void glutRemoveLayer(void);
除去覆寫圖。當沒有覆寫圖層時,調用這條語句也是安全的,這時系統不做任何事。
void glutPostOverlayRedisplay(void);
标記該覆寫圖層為需要重新顯示的狀态。
void glutShowOverlay(void);
void glutHideOverlay(void);
顯示目前視窗的覆寫圖層;隐藏覆寫圖層。這兩條語句即時執行。注意一下,隻有視窗可視時,使用glutShowOverlay才能使其覆寫圖層可視。當視窗被其他視窗遮擋時,其覆寫圖層也被遮擋進而不可視。
五、菜單管理
int glutCreateMenu(void (*func)(int value))
當點選菜單時,調用回調函數func,value為傳遞給回調函數的數值,它由所選擇的菜單條目對應的整數值所決定。
這個函數建立一個新的彈出式菜單,并傳回一個唯一的辨別次菜單的整型辨別符,并将建立的彈出菜單與func函數關聯在一起,這樣,當選擇此菜單中的一個菜單條目時,調用回調函數func.
void glutSetMenu(int menu);
int glutGetMenu(void);
設定目前菜單;擷取目前菜單的辨別符
void glutDestroyMenu(int menu);
删除指定的菜單
void glutAddMenuEntry(char* name, int value);
添加一個菜單條目
void glutAddSubMenu(char* name, int menu);
在目前菜單的底部增加一個子菜單的觸發條目
void glutChangeToMenuEntry(int entry, char* name, int value);
更改目前菜單中指定菜單項
void glutChangeToSubMenu(int entry, char* name, int menu);
将指定的目前菜單中菜單項變為子菜單觸發條目
void glutRemoveMenuItem(int entry);
删除指定的菜單項
void glutAttachMenu(int button);
void glutDetachMenu(int button);
把目前視窗的一個滑鼠按鍵與目前菜單關聯起來;解除滑鼠按鍵與彈出式菜單的關聯關系
六、注冊回調
void glutDisplayFunc(void (*func)(void) );
為目前視窗設定顯示回調函數
void glutOverlayDisplayFunc(void (*func)(void) );
注冊目前視窗的重疊層的顯示回調函數
void glutReshapeFunc(void (*Func)(int width, int height) );
指定當視窗的大小改變時調用的函數
void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y) );
注冊目前視窗的鍵盤回調函數
void glutMouseFunc(void (*func) (int button, int state, int x, int y));
注冊目前視窗的滑鼠回調函數
func為注冊的滑鼠回調函數,這個函數完成滑鼠事件的處理
button為滑鼠的按鍵,為以下定義的常量
GLUT_LEFT_BUTTON | 滑鼠左鍵 |
GLUT_MIDDLE_BUTTON | 滑鼠中鍵 |
GLUT_RIGHT_BUTTON | 滑鼠右鍵 |
state為滑鼠按鍵的動作,為以下定義的常量
GLUT_UP | 滑鼠釋放 |
GLUT_DOWN | 滑鼠按下 |
x,y為滑鼠按下式,光标相對于視窗左上角的位置
void glutMotionFunc(void (*func)(int x, int y));
void glutPassiveMotionFunc(void (*func)(int x, int y));
設定移動回調函數;設定目前滑鼠移動函數
Func為注冊的滑鼠移動函數
x,y為滑鼠按下式,光标相對于視窗左上角的位置
當滑鼠在視窗中按下并移動時調用glutMotionFunc注冊的回調函數
當滑鼠在視窗中移動時調用glutPassiveMotionFunc注冊的回調函數
void glutVisibilityFunc(void (*func) (int state) );
設定目前視窗的可視回調函數
Func為指定的可視回調函數
state表示視窗的可視性,為以下常量:
GLUT_NOT_VISIBLE | 視窗完全不可見 |
GLUT_VISIBLE | 視窗可見或部分可見 |
這個函數設定目前視窗的可視回調函數,當視窗的可視性改變時,該視窗的可視回調函數被調用.隻要視窗中的任何一個像素是可見的,或者他的任意一個子視窗中任意一個像素是可見的,GLUT則認為視窗是可見的.
void glutEntryFunc(void (*func) (int state));
設定滑鼠的進出視窗的回調函數
Func為注冊的滑鼠進出回調函數
state為滑鼠的進出狀态,為以下常量之一:
GLUT_LEFT | 滑鼠離開視窗 |
GLUT_RIGHT | 滑鼠進入視窗 |
當視窗取得焦點或失去焦點時調用這個函數,當滑鼠進入視窗區域并點選時,state為GLUT_RIGHT,當滑鼠離開視窗區域點選其他視窗時,state為GLUT_LEFT.
void glutSpecialFunc(void (*func) (int key, int x, int y))
設定目前視窗的特定鍵的回調函數
Func為注冊的特定鍵的回調函數
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為當按下鍵時滑鼠的坐标,相對于視窗左上角,以像素為機關
注意:ESC,回車和delete鍵由ASCII碼産生.
void glutMenuStatusFunc(void (*func) (int status, int x, int y));
設定菜單狀态回調函數
func是注冊的菜單狀态回調函數
status是目前是否使用菜單,為以下定義的常量
GLUT_MENU_IN_USE | 菜單正在使用 |
GLUT_MENU_NOT_IN_USE | 菜單未被使用 |
x,y是滑鼠按下式,光标相對于視窗左上角的位置
這個函數時glut程式判定是否正在使用菜單,當彈出菜單時,調用注冊的菜單狀态回調函數,同時status設定為常量GLUT_MENU_IN_USE, 當菜單使用完畢時,也調用菜單狀态回調函數,此時status變量變為GLUT_MENU_NOT_IN_USE.從已彈出的菜單中再彈出的菜單不産生菜單狀态回調過程.每個glut程式隻有一個菜單狀态回調函數.
glutSpaceballRotateFunc
glutSpaceballButtonFunc
glutButtonBoxFunc
glutDialsFunc
glutTabletMotionFunc
glutTabletButtonFunc
void glutMenuStatusFunc(void (*func) (int status, int x, int y));
設定菜單狀态回調函數
func為注冊的菜單狀态回調函數
status表示目前是否使用菜單,為以下定義的常量
GLUT_MENU_IN_USE | 菜單正在使用 |
GLUT_MENU_NOT_IN_USE | 菜單未被使用 |
x,y表示滑鼠按下式,光标相對于視窗左上角的位置
這個函數時glut程式判定是否正在使用菜單,當彈出菜單時,調用注冊的菜單狀态回調函數,同時status設定為常量GLUT_MENU_IN_USE, 當菜單使用完畢時,也調用菜單狀态回調函數,此時status變量變為GLUT_MENU_NOT_IN_USE.從已彈出的菜單中再彈出的菜單不産生菜單狀态回調過程.每個glut程式隻有一個菜單狀态回調函數.
void glutIdleFunc(void (*func) (void));
設定空閑回調函數
func表示當系統空閑時調用的函數,它的形式為void func(void)
void glutTimerFunc(unsigned int msecs, void (*Func)(int value), int value);
注冊一個回調函數,當指定時間值到達後,由GLUT調用注冊的函數一次
msecs是等待的時間
Func是注冊的函數
value是指定的一個數值,用來傳遞到回調函數Func中
這個函數注冊了一個回調函數,當指定的毫秒數到達後,這個函數就調用注冊的函數,value參數用來向這個注冊的函數中傳遞參數.
七、色彩管理(未完成)
glutSetColor
glutGetColor
glutCopyColormap
八、狀态檢索
int glutGet(GLenum state);
檢索指定的GLUT狀态
state為指定要檢索的狀态類型,為以下常量
state常量 | 描述 |
GLUT_WINDOW_X | 目前視窗的x坐标,以像素為機關 |
GLUT_WINDOW_Y | 目前視窗的y坐标,以像素為機關 |
GLUT_WINDOW_WIDTH | 當其視窗的寬度,以像素為機關 |
GLUT_WINDOW_HEIGHT | 目前視窗的高度,以像素為機關 |
GLUT_WINDOW_BUFFER_SIZE | 目前視窗中,顔色分量占用的位數,即用多少bit表示顔色分量 |
GLUT_WINDOW_STENCIL_SIZE | 目前視窗中,蒙闆分量占用的位數,即用多少bit表示蒙闆分量 |
GLUT_WINDOW_DEPTH_SIZE | 目前視窗中,深度分量占用的位數,即用多少bit表示深度分量 |
GLUT_WINDOW_RED_SIZE | 目前視窗中,紅色分量占用的位數,即用多少bit表示紅色分量 |
GLUT_WINDOW_GREEN_SIZE | 目前視窗中,綠色分量占用的位數,即用多少bit表示綠色分量 |
GLUT_WINDOW_BLUE_SIZE | 目前視窗中,藍色分量占用的位數,即用多少bit表示藍色分量 |
GLUT_WINDOW_ALPHA_SIZE | 目前視窗中,alpha色分量占用的位數,即用多少bit表示alpha色分量 |
GLUT_WINDOW_ACCUM_RED_SIZE | 目前視窗累積緩存中,紅色分量占用的位數,即用多少bit表示紅色分量 |
GLUT_WINDOW_ACCUM_GREEN_SIZE | 目前視窗累積緩存中,綠色分量占用的位數,即用多少bit表示綠色分量 |
GLUT_WINDOW_ACCUM_BLUE_SIZE | 目前視窗累積緩存中,藍色分量占用的位數,即用多少bit表示藍色分量 |
GLUT_WINDOW_ACCUM_ALPHA_SIZE | 目前視窗累積緩存中,alpha色分量占用的位數,即用多少bit表示alpha色分量 |
GLUT_WINDOW_DOUBLEBUFFER | 如果視窗式雙緩存模式,傳回1,否則傳回0 |
GLUT_WINDOW_RGBA | 如果視窗是RGBA模式,傳回1,否則傳回0 |
GLUT_WINDOW_PARENT | 查詢目前視窗的父視窗個數,如果為頂層視窗傳回0 |
GLUT_WINDOW_NUM_CHILDREN | 查詢目前視窗的子視窗個數 |
GLUT_WINDOW_NUM_SAMPLES | 查詢多重采樣的采樣點個數 |
GLUT_WINDOW_STEREO | 查詢是否使用立體模式,是則傳回1,否則傳回0 |
GLUT_WINDOW_CURSOR | 傳回光标的整數标示 |
GLUT_SCREEN_HEIGHT | 螢幕的高度,以像素為機關 |
GLUT_SCREEN_WIDTH | 螢幕的寬度,以像素為機關 |
GLUT_SCREEN_WIDTH_MM | 螢幕的寬度,以毫米為機關 |
GLUT_SCREEN_HEIGHT_MM | 螢幕的高度,以毫米為機關 |
GLUT_MENU_NUM_ITEMS | 查詢目前菜單包含的菜單項的個數 |
GLUT_DISPLAY_MODE_POSSIBLE | 查詢視窗系統是否支援目前的顯示模式,1表示支援,0表示不支援 |
GLUT_INIT_DISPLAY_MODE | 初始視窗的顯示模式 |
GLUT_INIT_WINDOW_X | 初始視窗的x坐标 |
GLUT_INIT_WINDOW_Y | 初始視窗的y坐标 |
GLUT_INIT_WINDOW_WIDTH | 初始視窗的寬度 |
GLUT_INIT_WINDOW_HEIGHT | 初始視窗的高度 |
GLUT_ELAPSED_TIME | 傳回兩次調用glutGet(GLUT_ELAPSED_TIME)的時間間隔,機關為毫秒 |
傳回值根據查詢的内容傳回相應的值,無效的狀态名傳回-1.
int glutLayerGet(GLenum info);
查詢屬于目前視窗的重疊層的狀态
Info表示查詢的重疊層狀态常量
GLUT_OVERLAY_POSSIBLE | 在給定的初始顯示模式下,能否為目前視窗建立重疊層.如果能,傳回1;如果不能,傳回0 |
GLUT_LAYER_IN_USE | 傳回目前的使用層,為GLUT_NORMAL或GLUT_OVERLAY |
GLUT_HAS_OVERLAY | 判斷目前視窗是否建立了重疊層 |
GLUT_NORMAL_DAMAGED | 如果目前視窗的圖像層在上一次顯示回調函數調用後已經破壞,則傳回TRUE |
GLUT_OVERLAY_DAMAGED | 如果目前視窗的重疊層在上一次顯示回調函數調用後已經破壞,則傳回TRUE |
int glutDeviceGet(GLenum info);
檢索裝置資訊
info為要檢索的裝置資訊的名字,為以下常量
GLUT_HAS_KEYBOARD | 如果鍵盤可用,傳回非0值,否則,傳回0 |
GLUT_HAS_MOUSE | 如果滑鼠可用,傳回非0值,否則,傳回0 |
GLUT_NUM_MOUSE_BUTTONS | 傳回滑鼠支援的按鍵數,如果滑鼠不可用,傳回0 |
傳回值0表示檢索的裝置不存在,非0表示裝置可用
int glutGetModifiers(void);
傳回組合功能鍵的狀态
傳回值為以下定義的常量
GLUT_ACTIVE_SHIFT | 當按下shift鍵時 |
GLUT_ACTIVE_CTRL | 當按下ctrl鍵時 |
GLUT_ACTIVE_ALT | 當按下alt鍵時 |
int glutExtensionSupported(char* extension);
判定是否支援特定的OpenGL擴充
extension是指定要測試的OpenGL擴充的名稱
如果給定擴充獲得支援,函數傳回非0,否則傳回0
九、字型渲染
void glutBitmapCharacter(void* font, int character);
繪制一個圖像字元
Font表示要使用的圖像字型,如下表所示:
GLUT_BITMAP_8_BY_13 | 一種固定寬度字型,每個字元都放在一個8x13像素的矩形框内 |
GLUT_BITMAP_9_BY_15 | 一種固定寬度字型,每個字元都放在一個9x15像素的矩形框内 |
GLUT_BITMAP_TIMES_ROMAN_10 | 一種10點均勻間距的Times Roman字型 |
GLUT_BITMAP_TIMES_ROMAN_24 | 一種24點均勻間距的Times Roman字型 |
GLUT_BITMAP_HELVETICA_10 | 一種10點均勻間距的Helvetica字型 |
GLUT_BITMAP_HELVETICA_12 | 一種12點均勻間距的Helvetica字型 |
GLUT_BITMAP_HELVETICA_18 | 一種18點均勻間距的Helvetica字型 |
Character表示要繪制的字元
int glutBitmapWidth(GLUTbitmapFont font, int character);
傳回一個圖像字元的寬度
font是指定的圖像字型,如下表所示:
GLUT_BITMAP_8_BY_13 | 一種固定寬度字型,每個字元都放在一個8x13像素的矩形框内 |
GLUT_BITMAP_9_BY_15 | 一種固定寬度字型,每個字元都放在一個9x15像素的矩形框内 |
GLUT_BITMAP_TIMES_ROMAN_10 | 一種10點均勻間距的Times Roman字型 |
GLUT_BITMAP_TIMES_ROMAN_24 | 一種24點均勻間距的Times Roman字型 |
GLUT_BITMAP_HELVETICA_10 | 一種10點均勻間距的Helvetica字型 |
GLUT_BITMAP_HELVETICA_12 | 一種12點均勻間距的Helvetica字型 |
GLUT_BITMAP_HELVETICA_18 | 一種18點均勻間距的Helvetica字型 |
character為指定的字元
傳回指定字元的寬度,以像素為機關
void glutStrokeCharacter(void* font, int character);
繪制一個圖形字元
Font表示要使用的圖形字型,如下表所示:
GLUT_STROKE_ROMAN | 一種等間距的Roman Simplex字型,僅包括32到127的ASCII字元 |
GLUT_STROKE_MONO_ROMAN | 一種單一間距的Roman Simplex字型,僅包括32到127的ASCII字元 |
Character為要繪制的字元
int glutStrokeWidth(GLUTstrokeFont font, int character);
傳回一個圖形字型的寬度
Font是指定的圖形字型,如下表所示:
GLUT_STROKE_ROMAN | 一種等間距的Roman Simplex字型,僅包括32到127的ASCII字元 |
GLUT_STROKE_MONO_ROMAN | 一種單一間距的Roman Simplex字型,僅包括32到127的ASCII字元 |
Character為繪制的字元
十、實體繪制
以下所有函數中,radius表示球體的半徑,slices表示球體圍繞z軸分割的數目,stacks表示球體沿着z軸分割的數目。
繪制中心在模型坐标原點,半徑為radius的球體,球體圍繞z軸分割slices次,球體沿着z軸分割stacks次
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 線框球
void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 實心球
void glutWireCube(GLdouble size); 線框立方體
void glutSolidCube(GLdouble size); 實心立方體
void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); 線框圓環
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); 實心圓環
void glutWireIcosahedron(void); 線框20面體
void glutSolidIcosahedron(void); 實心20面體
void glutWireOctahedron(void); 線框8面體
void glutSolidOctahedron(void); 實心8面體
void glutWireTetrahedron(void); 線框4面體
void glutSolidTetrahedron(void); 實心4面體
void glutWireDodecahedron(GLdouble radius); 線框12面體
void glutSolidDodecahedron(GLdouble radius); 實心12面體
void glutWireCone(GLdouble radius, GLdouble height, GLint slices, GLint stacks); 線框圓錐體
void glutSolidCone(GLdouble radius, GLdouble height, GLint slices, GLint stacks); 實心圓錐體
void glutWireTeapot(GLdouble size); 線框茶壺
void glutSolidTeapot(GLdouble size); 實心茶壺
十一、執行個體
初始化及簡單平面圖形
#include <GL/glut.h>
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glFlush();
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("3D Tech- GLUT Tutorial");
glutDisplayFunc(renderScene);
glutMainLoop();
return 0;
}