從0開始的OpenGL學習(一)-創建OpenGL窗口

圖片資源來源于網絡

本文主要解決兩個問題:

1、OpenGL到底是什么鬼?
2、如何創建一個使用OpenGL的窗口?

1、OpenGL到底是什么鬼?

筆者也算是一個入門的C++程序員了,一下決心要學習OpenGL之后就直接上谷歌搜了OpenGL的官網(當然這是要翻越萬里長城的),想下一個API就上手。然而在官網上溜了一大圈,楞是沒找到一個下載API的地方,倒是在各種顯卡廠商的官網上都轉了一圈,灰頭土臉。

在網上找了很多資料之后,終于明白了一點,這也是非常重要的一點,就是:OpenGL并不是一個API(API這個應該懂吧,搞編程的人都知道。什么?你說你不是搞編程的?那你看這篇文章,還不速速出門右轉。)庫,而是一組規范,這組規范是由Khronos Group來維護的。(別問我Khronos Group是什么鬼,對于只能寫入門文字的筆者來說,這也是第一次看到。)

這組規范定義了一組函數,這組函數傳入的是什么參數,傳出的是什么結果。由于只是這樣的一組規范,所以只要合乎規范,誰都能以不同的方式實現函數。這也就是在官網上找不到API庫的原因了,通常這些API是由顯卡廠商實現的。順便說一句,如果裝了VS,VS里自帶有OpenGL的庫(至少筆者的VS2013里有)。

狀態機

OpenGL本身就是一個大狀態機:有很多變量可以設置以便我們控制其操作。OpenGL的狀態通常被稱為上下文(context)。我們在操作OpenGL的時候就是通過改變其狀態來改變其運行的上下文,這樣OpenGL就能給我們想要的結果了。

2、如何創建一個使用OpenGL的窗口?

2.1 所需工具

GLFW庫+VS2013+GLAD源碼

扯扯這些東西都是干啥用的。

GLFW是一個開源的跨平臺窗口庫,它封裝了與操作系統相關的創建窗口的過程,讓我們的窗口創建只需要調用少量的函數就能實現。(媽媽再也不用擔心我不會創建窗口了)

VS2013,額,湊個字數,你懂的

GLAD源碼是用來封裝調用OpenGL庫中的函數的,讓我們調用OpenGL函數的時候只需要用熟悉的函數調用方式,不需要創建一個函數指針,然后加載dll中的函數地址,然后再調用。說的有點抽象啊,舉個例子就知道了。原本我們的代碼要是這個樣子:

typedef void (*GL_GENBUFFERS)(GLsizei, GLuint*);
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
glGenBuffers(1, &buffer);   //這里才是調用函數的位置,上面只是獲取函數地址

有了GLAD源碼之后,我們就只需要這樣子就行了:

glGenBuffers(1,&buffer);    //省去了獲取函數地址的操作

2.2 環境打造:

第一步:下載GLFW

官網地址是:http://www.glfw.org/download.html(你需要翻墻才能訪問)
選擇下載源文件,

圖片資源來源于網絡

文件包名為glfw-3.2.1.zip

第二步:下載CMake,編譯glfw的源碼

GLFW的源碼是需要通過CMake來編譯的,所以我們要下載一個CMake來使用。放心,CMake的使用非常方便。

官網地址是:https://cmake.org/download/(也需要翻墻才能訪問),下載最新版本3.9.3,windows 32位版本,

圖片資源來源于網絡

安裝完成后,打開CMake,對其進行如下設置

CMake的編譯設置

將源文件的目錄和要生成的編譯工程文件的目錄設置好,設置成相同的目錄就可以了。我們將其設置成解壓后的根目錄。

點擊左下角的Configure按鈕,在彈出的窗口的選擇編譯器中選擇“Visual Studio 12 2013”,如下圖

編譯器設置

點擊“Finish”,在等待一段時間之后,出現如下界面


設置好編譯器之后

什么都不用管,直接點擊左下角的Generate按鈕,非常快速的進度條之后,打開解壓GLFW的目錄,就能看到VS2013版本的GLFW工程了


生成好工程的狀態

有些讀者在編譯的時候可能會出問題,筆者也不知道什么原因,在這里直接提供編譯好的供大家使用。

第三步:下載GLAD

官網地址:http://glad.dav1d.de/(繼續翻),選擇好需要的版本和模式

選擇好要下載的版本

點擊頁面最下方右下角的GENERATE按鈕,在隨后彈出的頁面中,點擊glad.zip進行下載


下載zip
第四步:組裝開發庫目錄

新建一個文件夾,取名為OpenGL,將GLFW目錄中的include目錄復制到OpenGL目錄中去

在OpenGL文件夾下新建一個文件夾,取名為lib,將編譯好的GLFW庫復制到lib文件夾下,GLFW庫的位置是:glfw-3.2.1\src,將里面的Debug和Release兩個目錄復制,拷貝到lib文件夾下。

復制glad解壓文件夾中,include目錄下的兩個文件夾glad和KHR復制,拷貝到OpenGL目錄下,include文件夾中

完成之后,我們的OpenGL文件夾下是這樣子


OpenGL目錄

include文件夾下是這樣


include目錄

lib文件夾下是這樣


lib目錄
第五步:創建項目,設置路徑

用VS2013創建一個HelloWindow空項目工程,將glad文件夾下的glad.c文件拷貝到工程中,并將glad.c文件添加到項目中
打開項目的屬性,選擇VC++目錄標簽,設置包含目錄和庫目錄到我們之前設置的路徑下,如圖


工程目錄設置

注意debug是這樣設置,Release的話將庫目錄指定到Release目錄就可以了

Release目錄設置

點擊鏈接器,選擇輸入標簽,在附加依賴項中加入opengl32.lib;glfw3.lib;兩項,Debug和Release模式下名字是一樣的

確定,這樣我們的項目設置就完成了。

第六步:創建窗口

添加cpp文件,取名為main.cpp,在main函數中加入如下代碼

主函數代碼

其中framebuffer_size_callback和processInput是兩個處理消息的函數

framebuffer_size_callback用于當窗口大小改變時,改變OpenGL視口的區域大小

processInput函數處理輸入事件

兩個函數的實現如下:


子函數代碼

編譯項目,運行就成功了

運行效果圖

好了,到此為止,我們已經成功創建了一個使用OpenGL的窗口,萬里長征終于走出了第一步。歇口氣,休息一會再學下一章!

下一篇
目錄

參考資料:

learnopengl.com(這是一個非常不錯的網站,筆者就是在這個網站上學的,這一系列的文章大部分是參考這里的內容,強烈推薦想學的小伙伴去這里學)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容