天天看點

GLUT 函數說明

一、初始化

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;
}