GLUT教程
在這個部分我們將在我們的程序裏建立一個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();
}