OpenGL 標準沒有指定任何用于建立和使用窗口的 API。在x系統(tǒng)中提供 OpenGL 的接口為 GLX。Windows 提供 WGL 而 MacOS 提供 CGL。為了建立一個能夠顯示圖像的窗口,我們直接使用這些接口,這樣就不用關(guān)心在不同操作系統(tǒng)中的具體實現(xiàn)細節(jié)。我們這里使用的庫叫 ‘OpenGL utility library’ 簡稱 GLUT。它為窗口的管理、事件處理、IO 控制和一些其他的設(shè)備管理提供了一個簡單的 API。此外,GLUT 是跨平臺的,這使移植更方便。SDL 和GLFW 可代替 GLUT。
glutInit(&argc,argv);
這個函數(shù)是為了初始化 GLUT。里面的參數(shù)可以直接從命令行中得到,同時可以包含其他有用的選項比如 '-sync' 和 '-gldebug',這樣可以自動的檢查GL的錯誤并獨立的顯示它們。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
現(xiàn)在我們學習設(shè)置一些 GLUT 的參數(shù),GLUT_DOUBLE 設(shè)置雙緩沖(double buffering,即當一個 buffer 顯示的時候,另一個 buffer 用來繪制)和 color buffer,后者是大多數(shù)渲染結(jié)束的地方(比如屏幕)。后面章節(jié)中我們經(jīng)常用到這兩個和其他的參數(shù)。
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
這些函數(shù)設(shè)置了窗口的參數(shù)(包括窗口大小、窗口位置以及窗口標題)并創(chuàng)建窗口。
glutDisplayFunc(RenderSceneCB);
因為我們工作在一個窗口系統(tǒng)中,可以通過事件回調(diào)函數(shù)與運行中的項目進行交互。GLUT 可以和基本的窗口系統(tǒng)進行交互,并且提供給我們一些回調(diào)函數(shù)。在這里我們僅僅使用了一個主回調(diào)函數(shù),這個主回調(diào)函數(shù)完成了一幀中的所有渲染工作。這個函數(shù)被 GLUT 內(nèi)部循環(huán)不斷的調(diào)用。
glClearColor(0.0f,0.0f, 0.0f, 0.0f);
在 OpenGL 中,這是我們第一次遇到 ‘state’ 這個概念。提出 ‘state’ 的原因是:渲染是一個復(fù)雜的任務(wù),不能夠像對待一個接受參數(shù)的函數(shù)命令(設(shè)計良好的函數(shù)不會有太多參數(shù))一樣對待它。你需要去指定 shaders、buffers 和各種可以影響渲染過程的屬性。此外,你會經(jīng)常需要讓幾個渲染操作有同樣的設(shè)置(比如,如果你從未禁用深度測試的功能,那就不用在每次渲染調(diào)用的時候去設(shè)置它)。這就是為什么 “大部分渲染操作的配置是通過設(shè)置 OpenGL 狀態(tài)機內(nèi)的屬性和參數(shù)值來完成,而渲染命令僅能使用跟繪制的頂點的個數(shù)和初始偏移量有關(guān)的個別參數(shù)” 的原因。在調(diào)用一個狀態(tài)改變函數(shù)之后(改變 OpenGL 的狀態(tài)),這個狀態(tài)將保持不變直到用不同的參數(shù)值再次調(diào)用此函數(shù)。上面這個函數(shù)是用來設(shè)置清除幀緩存(后面介紹)時要用到的顏色。顏色有四個通道(RGBA),而且它被指定為 0.0 – 1.0 之間標準化的值。
glutMainLoop();
這個函數(shù)調(diào)用將控制傳遞給 GLUT,并且開啟了它自己內(nèi)部的循環(huán)。在這個循環(huán)中,它監(jiān)聽來自窗口系統(tǒng)的事件并通過我們設(shè)置的回調(diào)函數(shù)傳遞給 GLUT。在本例子中,GLUT只調(diào)用我們定義用來顯示窗口的回調(diào)函數(shù)(RenderSceneCB),以使我們能渲染幀。
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
第一個函數(shù)的功能僅僅就是清除幀緩存(使用我們在上面指定過的顏色)。第二個函數(shù)調(diào)用是為了告訴 GLUT 在 backbuffer 和 frontbuffer 之間進行交換。在通過幀回調(diào)函數(shù)的下一個循環(huán)中,我們將場景渲染到當前的 frontbuffer 中,而 backbuffer 將被顯示。
http://wiki.jikexueyuan.com/project/modern-opengl-tutorial/images/picture01.png" alt="" />