OpenGL(試用篇)——第一個OpenGL程序(1)

一、工欲善其事,必先利其器。

開搞之前,得先把湊齊裝備。不指望能像孫大聖,那樣上來就配個十萬八千斤的金箍棒,但基本的工具還是要必備的。

OpenGL只負責圖形的渲染,所以想窗口的創建,讀取圖片,生成矩形神馬的。都不屬於GL的範疇,同時爲了貫徹“堅決不重複造輪子”的方針,決定配備以下工具

  1. OpenGL實用工具包:freeglut——創建和管理各個平臺平臺上的OpenGL上下文的窗口,也看到鼠標,鍵盤和操縱桿功能

  2. OpenGL數學庫:glm——生成OpenGL所需的各種矩陣

  3. OpenGL擴展庫:glew——用於幫助C/C++開發者初始化擴展(OpenGL擴展功能)並書寫可移植的應用程序。

配置OpenGL的環境,可謂老生常談的問題。推薦參考這篇文章

http://www.cnblogs.com/liangliangh/p/3521381.html

不僅告訴你怎麼配置,還會解決配置遇到的各種問題。建議仔細閱讀。

二、第一個OpenGL程序

先來看看效果,會變色哦~~

image002



1利用glut創建窗口

既然學的是OpenGL,也就沒必要糾結什麼Win32窗口編程之類的旁枝細節,剛好glut爲我們提高提供良好的平臺,幾句代碼就能創建一個窗口,以後的工作都會在這個窗口裏進行。




第一個窗口就正式誕生了,雖然一片空白



image004





PS:以後main函數的代碼大致是不會變的,基本上就是這個步驟

  1. l初始化GL的繪製模式

  2. l設置窗口大小

  3. l創建窗口

  4. l設置改變窗口大小的回調函數

  5. l設置鍵盤按下和鬆開的回調函數

  6. l設置特殊按鍵按下和鬆開的回調函數

  7. l設置渲染的回調函數

  8. l初始化GL的擴展庫(由於Windows只支持OpenGL1.x)如果想使用可編程管線,必須要用到glew

  9. lGL的初始化

  10. l所有設置完成後,開始主循環

1.1調整好你的GL——初始化設置

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:開啓深度測試。這裏簡單介紹下,OpenGL3D API,因此要有個三維的概念,近的物體會把遠的物體擋住,這樣遠的物體全部或者部分就不用繪製了。要使OpenGL具有這個功能,就需要開啓深度測試。一般情況下,爲了可觀性和真實性,都會開啓該選項。



好了現在讓我們run起來。

image004

咦?爲啥還是白色的?不是設置了清屏顏色是黑色了嗎?



原因就在於,設置是設置了,但是真正的清屏操作並沒有執行。看過動漫的都知道,動畫的原理,就是一張張畫出來,然後快速播放。

GL繪製時也是這樣的原理,只不過GL每次繪製的圖形,稱作幀。

1.2我想畫背景——清屏顏色

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,再來運行

image007

Oh~~神馬情況,怎麼還是白色?



實際上,緩存已經清除了,只是GL是在後臺清除的。因爲,我們使用的雙緩衝。


glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);


其中GLUT_DOUBLE就是設置雙緩衝。



image008

實際上,我們清屏操作是在Back Buffer執行的,從圖中可以看到,GL繪製時在Back Buffer上繪製的,然後在和前臺緩衝,也就是屏幕,交換。也就是"。循環以上操作。

因此,我們還得再加上這句代碼,讓前後緩衝交換。


void display(){      
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);      
   glutSwapBuffers();      
}



image010



這下終於變黑色了。這樣,我們GL的初始化工作就做好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章