在這個部分我們將在我們的程式裡建立一個main函數,這個main函數將完成必須的初始化和開啟事件處理迴圈。所有的GLUT函數都有glut首碼並且那些完成一些初始化的函數有glutInit首碼。你首先要做的是調用函數glutInit()。
Void glutInit(int*argc,char**argv);
參數:
Argc:一個指標,指向從main()函數傳遞過來的沒更改的argc變數。
Argv:一個指標,指向從main()函數傳遞過來的沒更改的argv變數。
在初始化GLUT後,我們開始定義我們的視窗。首先確定視窗位置(它預設的是螢幕左上方),我們使用函數glutInitWindowPosition()。
Void glutInitWindowPositon(int x,int y);
參數:
X: 距離螢幕左邊的像素數。-1是預設值,意思就是由視窗管理程式決定視窗出現在哪裡。如果不使用預設值,那你就自己設定一個值。
Y:距離螢幕上邊的像素數。和X一樣。
注意,參數僅僅是對視窗管理程式的一個建議。儘管你精心的設定了視窗位置,window返回的可能是不同的位置。如果你設定了,一般會得到你想要的結果。接下來我們設定視窗大小,使用函數glutInitWindowSize()。
Void glutInitWindowSize(int width,int height);
參數:
Width:視窗的寬度。
Height:視窗的高度。
同樣width,height也只是一個參考數字。避免使用負數。
接下來。你應該使用函數glutInitDisplayMode()定義顯示方式。
Void glutInitDisplayMode(unsighed int mode)
參數:
Mode――可以指定下列顯示模式
Mode參數是一個GLUT庫裡預定義的可能的布爾組合。你使用mode去指定顏色模式,數量和緩衝區類型。
指定顏色模式的預定義常量有:
1:GLUT_RGBA或者GLUT_RGB。指定一個RGBA視窗,這是一個預設的顏色模式。
2:GLUT_INDEX。指定色彩索引模式。
這個顯示模式還允許你選擇單緩衝區或雙緩衝區視窗。
1:GLUT_SINGLE.單緩衝區視窗。
2:GLUT_BUFFER.雙緩衝區視窗,這是產生流暢動畫必須選的。
還可以指定更多,如果你想指定一組特殊的緩衝的話,用下面的變數:
1:GLUT_ACCUM.累積緩衝區。
2:GLUT_STENCIL.樣板緩衝區。
3:GLUT_DEPTH.深度緩衝區。
假定你想要一個有單緩衝區,深度緩衝區的RGB視窗,你用“或“(|)操作符來建立你想要的顯示模式。
…………….
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE|GLUT|DEPTH);
…………….
經過上面的這些步驟後,就可以調用函數glutCreateWindow()來建立視窗了。
Int glutCreateWindow(char* title);
參數:
Title:設定視窗的標題。
glutCreateWindow()的傳回值是一個視窗標識符。後面你可以在GLUT裡使用這個標識符,不過這個超出了本小節的範圍。
現在就有一些代碼來完成所有的初始化操作。
#include<gl/glut.h>
void main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow(“GLUT Tutorial”);
}
如果你運行上述代碼,你將會得到一個空的黑的控制台視窗,而沒有OpenGL視窗。並且控制台視窗將很快消失。
在我們渲染一些東西前,還有兩件事需要處理。第一告訴GLUT哪個函數負責渲染。我們建立一個簡單的渲染的函數。下面的這個函數將會清除顏色緩衝區並畫一個三角形。
...
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();
}
上面的函數的名字你可以自己取一個。現在你必須告訴GLUT使用我們上面的函數來進行渲染。這個叫寄存回調。。讓我們告訴GLUT這個函數renderScene應該被使用。當需要重畫的時候GLUT有一個只傳遞一個函數名稱參數的函數(以函數名為形參的函數)就會被調用。
void glutDisplayFunc(void (*func)(void));
參數:
func: 當視窗需要被重繪是調用的函數的名稱。注意使用NULL作為實參是錯誤的。
最後一件事是告訴GLUT我們準備進入應用程式事件處理迴圈。GLUT提供了一個函數讓程式進入一個永不結束的迴圈。一直等待處理下一個事件。函數是glutMainLoop()。
void glutMainLoop(void)
到目前為止所有的代碼都列在下面。如果你運行代碼,將會得到一個控制台視窗,和一個畫著一個白色三角形的OpenGL視窗,出現在你設定的位置,並有著你設定的尺寸。
#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();
}
void 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();
}