GLUT教程(二) GLUT初始化

來源:互聯網
上載者:User

在這個部分我們將在我們的程式裡建立一個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();

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.