OpenGL 中常用的 GLUT 函數庫
轉自:http://blog.sina.com.cn/s/blog_5f0d72800100iajl.html
GLUT函數說明
一、初始化
void glutInit(int* argc,char** argv)
這個函數用來初始化GLUT庫。對應 main 函數的形式應是: int main(int argc,char* argv[]);
這個函數從 main 函數獲取其兩個參數。
1 void glutInitWindowSize(int width,int height); 2 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。
九、實體繪制
以下所有函數中,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); 實心茶壺
