開搞以前,得先把湊齊裝備。不期望能像孫大聖,那樣上來就配個十萬八千斤的金箍棒,但基本的工具仍是要必備的。html
OpenGL只負責圖形的渲染,因此想窗口的建立,讀取圖片,生成矩形神馬的。都不屬於GL的範疇,同時爲了貫徹「堅定不重複造輪子」的方針,決定配備如下工具編程
OpenGL實用工具包:freeglut——建立和管理各個平臺平臺上的OpenGL上下文的窗口,也看到鼠標,鍵盤和操縱桿功能緩存
OpenGL數學庫:glm——生成OpenGL所需的各類矩陣ide
OpenGL擴展庫:glew——用於幫助C/C++開發者初始化擴展(OpenGL擴展功能)並書寫可移植的應用程序。函數
配置OpenGL的環境,可謂老生常談的問題。推薦參考這篇文章工具
http://www.cnblogs.com/liangliangh/p/3521381.html測試
不只告訴你怎麼配置,還會解決配置遇到的各類問題。建議仔細閱讀。動畫
先來看看效果,會變色哦~~spa
既然學的是OpenGL,也就不必糾結什麼Win32窗口編程之類的旁枝細節,恰好glut爲咱們提升提供良好的平臺,幾句代碼就能建立一個窗口,之後的工做都會在這個窗口裏進行。3d
第一個窗口就正式誕生了,雖然一片空白
PS:之後main函數的代碼大體是不會變的,基本上就是這個步驟
l初始化GL的繪製模式
l設置窗口大小
l建立窗口
l設置改變窗口大小的回調函數
l設置鍵盤按下和鬆開的回調函數
l設置特殊按鍵按下和鬆開的回調函數
l設置渲染的回調函數
l初始化GL的擴展庫(因爲Windows只支持OpenGL1.x)若是想使用可編程管線,必需要用到glew庫
lGL的初始化
l全部設置完成後,開始主循環
void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); }
#2:設置清屏顏色
GLAPIvoidGLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
看參數就知道,GL是經過RGBA來設置顏色。不知道RGBA是神馬玩意的,請自行Google~~
#3:開啓深度測試。這裏簡單介紹下,OpenGL的3D API,所以要有個三維的概念,近的物體會把遠的物體擋住,這樣遠的物體所有或者部分就不用繪製了。要使OpenGL具備這個功能,就須要開啓深度測試。通常狀況下,爲了可觀性和真實性,都會開啓該選項。
好了如今讓咱們run起來。
咦?爲啥仍是白色的?不是設置了清屏顏色是黑色了嗎?
緣由就在於,設置是設置了,可是真正的清屏操做並無執行。看過動漫的都知道,動畫的原理,就是一張張畫出來,而後快速播放。
GL繪製時也是這樣的原理,只不過GL每次繪製的圖形,稱做幀。
glutDisplayFunc(display);
main函數的這句代碼,就是設置GL的繪製函數。GL繪製圖形,實際上就是執行display().
void display(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); }
#2:glClear:真正執行清除操做的地方。咱們能夠經過設置不一樣的標誌位來清除不一樣的緩存。
好比:GL_COLOR_BUFFER_BIT就是用glClearColor設置的顏色清除顏色緩存。
GL_DEPTH_BUFFER_BIT就是清除深度緩存。
OK,再來運行
Oh~~神馬狀況,怎麼仍是白色?
實際上,緩存已經清除了,只是GL是在後臺清除的。由於,咱們使用的雙緩衝。
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
其中GLUT_DOUBLE就是設置雙緩衝。
實際上,咱們清屏操做是在Back Buffer執行的,從圖中能夠看到,GL繪製時在Back Buffer上繪製的,而後在和前臺緩衝,也就是屏幕,交換。也就是」前「變」後「,」後「變"前」。循環以上操做。
所以,咱們還得再加上這句代碼,讓先後緩衝交換。
void display(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); }
這下終於變黑色了。這樣,咱們GL的初始化工做就作好了。