入門-02.創(chuàng)建窗口

創(chuàng)建窗口

在我們畫出出色的效果之前,首先要做的就是創(chuàng)建一個OpenGL上下文(Context)和一個用于顯示的窗口胜宇。然而耀怜,這些操作在每個系統(tǒng)上都是不一樣的,OpenGL有目的的抽象(Abstract)這些操作桐愉。這意味著我們不得不自己處理創(chuàng)建窗口财破,定義OpenGL上下文以及處理用戶輸入。
幸運的是仅财,有一些庫已經(jīng)提供了我們所需的功能狈究,其中一部分是特別針對OpenGL的。這些庫節(jié)省了我們書寫平臺相關(guān)代碼的時間,提供給我們一個窗口和上下文用來渲染抖锥。最流行的幾個庫有GLUT亿眠,SDL,SFML和GLFW磅废。在教程里我們將使用GLFW纳像。

GLFW

GLFW是一個專門針對OpenGL的C語言庫,它提供了一些渲染物件所需的最低限度的接口拯勉。它允許用戶創(chuàng)建OpenGL上下文竟趾,定義窗口參數(shù)以及處理用戶輸入。
這一節(jié)和下一節(jié)的內(nèi)容是建立GLFW環(huán)境宫峦,并保證它恰當(dāng)?shù)貏?chuàng)建窗口和OpenGL上下文岔帽。

構(gòu)建GLFW

GLFW已經(jīng)有針對Visual Studio 2012/2013的預(yù)編譯的二進制版本(優(yōu)先選擇32為版本)和相應(yīng)的頭文件,但是為了完整性我們將從編譯源代碼開始导绷,

  1. 下載源代碼包犀勒。
  2. 一旦下載完了源碼包,解壓到某處妥曲。我們只關(guān)心里面的這些內(nèi)容:
    編譯生成的庫
    include文件夾

從源代碼編譯庫可以保證生成的目標(biāo)代碼是針對你的操作系統(tǒng)和CPU的贾费,而一個預(yù)編譯的二進制代碼并不保證總是適合。提供源代碼的一個問題是不是每個人都用相同的IDE來編譯檐盟,因而提供的工程文件可能和一些人的IDE不兼容褂萧。所以人們只能從.cpp和.h文件來自己建立工程,這是一項笨重的工作葵萎。因此誕生了一個叫做CMake的工具导犹。

CMAKE
CMake是一個工程文件生成工具,可以使用預(yù)定義好的CMake腳本陌宿,根據(jù)用戶的選擇生成不同IDE的工程文件锡足。這允許我們從GLFW源碼里創(chuàng)建一個Visual Studio 2012(或其他版本)工程文件。

CMake需要一個源代碼目錄和一個存放編譯結(jié)果的目標(biāo)文件目錄壳坪。源代碼目錄我們選擇GLFW的源代碼的根目錄舶得,然后我們新建一個build文件夾來作為目標(biāo)目錄。


之后爽蝴,點擊Configure(設(shè)置)按鈕沐批,我們選擇生成的目標(biāo)平臺為Visual Studio 11(因為Visual Studio 2012的內(nèi)部版本號是11.0)。CMake會顯示可選的編譯選項蝎亚,這里我們使用默認(rèn)設(shè)置九孩,再次點擊Configure(設(shè)置)按鈕,保存這些設(shè)置发框。保存之后躺彬,我們可以點擊Generate(生成)按鈕,生成的工程文件就會出現(xiàn)在你的build文件夾中。

編譯
在build文件夾里可以找到GLFW.sln文件宪拥,用Visual Studio 2012打開仿野。因為CMake已經(jīng)配置好了項目所以我們直接點擊Build Solution(構(gòu)建解決方案)然后編譯的結(jié)果glfw3.lib就會出現(xiàn)在src/Debug文件夾內(nèi)。(注意我們現(xiàn)在使用的glfw的版本號為3.1)
生成庫之后她君,我們需要讓IDE知道庫和頭文件的位置脚作。有兩種方法:

找到IDE或者編譯器的/lib和/include文件夾,之后添加GLFW的include目錄到/include里去缔刹,相似的將glfw3.lib添加到/lib里去球涛。這不是推薦的方式,因為很難去追蹤library/include文件夾校镐,而且重新安裝IDE/Compiler可能會導(dǎo)致這些文件丟失亿扁。
推薦的方式是建立一個新的目錄包含所有的第三方庫文件和頭文件,并且在你的IDE/Compiler中指定這些文件夾灭翔。我個人使用一個單獨的文件夾包含Libs和Include文件夾魏烫,在這里存放OpenGL工程用到的所有第三方庫和頭文件辣苏。這樣我的所有第三方庫都在同一個路徑(并且應(yīng)該在你的多臺電腦間共享)肝箱,然而要求是每次新建一個工程我們都需要告訴IDE/編譯器在哪能找到這些文件
完成上面步驟后,我們就可以使用GLFW創(chuàng)建我們的第一個OpenGL工程了稀蟋!

我們的第一個工程

讓我們打開Visual Studio煌张,創(chuàng)建一個新Viesual C++的工程。

鏈接(Linking)

為了使我們的程序使用GLFW退客,我們需要把GLFW庫鏈接(Link)進工程骏融。于是我們需要在鏈接器的設(shè)置里寫上glfw3.lib。但是我們的工程還不知道在哪尋找這個文件萌狂,于是我們首先需要將我們放第三方庫的目錄添加進設(shè)置档玻。
為了添加這些目錄,我們首先進入Project Properties(工程屬性)(在解決方案窗口里右鍵項目)茫藏,然后選擇VC++ Directories選項卡(如下圖)误趴。在下面的兩欄添加目錄:



現(xiàn)在VS可以找到我們鏈接GLFW需要的所有文件了。最后需要在Linker(鏈接器)選項卡里的Input選項卡里添加glfw3.lib這個文件:



要鏈接一個庫我們必須告訴鏈接器它的文件名务傲。因為我們的庫名字是glfw3.lib凉当,我們把它加到Additional Dependencies域里面(手動或者使用選項)。這樣GLFW就會被鏈接進我們的工程售葡。除了GLFW看杭,你也需要鏈接OpenGL的庫,但是這個庫可能因為系統(tǒng)的不同而有一些差別挟伙。
  • Windows上的OpenGL庫
    如果你是Windows平臺楼雹,opengl32.lib已經(jīng)隨著Microsoft SDK裝進了Visual Studio的默認(rèn)目錄,所以Windows上我們只需將opengl32.lib添加進Additional Dependencies。

  • Linux上的OpenGL庫
    在Linux下你需要鏈接libGl.so贮缅,所以要添加-lGL到你的鏈接器設(shè)置里瓜贾。如果找不到這個庫你可能需要安裝Mesa,NVidia或AMD的開發(fā)包携悯,這部分因平臺而異就不仔細(xì)講解了祭芦。

現(xiàn)在,如果你添加好了GLFW和OpenGL庫憔鬼,你可以用如下方式添加GLFW頭文件:

#include <GLFW\glfw3.h>

這個頭文件包含了GLFW的設(shè)置龟劲。

GLEW

因為OpenGL只是一個規(guī)范,具體的實現(xiàn)是由驅(qū)動開發(fā)商針對特定顯卡實現(xiàn)的轴或。由于顯卡驅(qū)動版本眾多昌跌,大多數(shù)函數(shù)都無法在編譯時確定下來,需要在運行時獲取照雁。開發(fā)者需要運行時獲取函數(shù)地址并保存下來供以后使用。Windows下看起來類似這樣:

// 定義函數(shù)類型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正確的函數(shù)并賦值給函數(shù)指針
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 現(xiàn)在函數(shù)可以被正常調(diào)用了
GLuint buffer;
glGenBuffers(1, &buffer);

幸運的是萍诱,有一個針對此目的的庫,GLEW,是目前最流行的做這件事的方式。

編譯和鏈接GLEW
GLEW是OpenGL Extension Wrangler Library的縮寫退盯,它管理我們上面提到的一系列繁瑣的任務(wù)。因為GLEW也是一個庫,我們同樣需要鏈接進工程漓骚。
我們使用GLEW的靜態(tài)版本glew32s.lib(注意這里的’s’)噩斟,用如上的方式添加其庫文件和頭文件齐鲤,最后在鏈接器的選項里加上glew32s.lib牡肉。注意GLFW3也是編譯成了一個靜態(tài)庫炭庙。
如果你希望靜態(tài)鏈接GLEW免绿,必須在包含GLEW頭文件之前定義預(yù)編譯宏GLEW_STATIC:

#define GLEW_STATIC
#include <GL/glew.h>

如果你希望動態(tài)鏈接迹卢,那么就不要定義這個宏。但是使用動態(tài)鏈接的話你需要拷貝一份dll文件到你的應(yīng)用程序目錄殃饿。

對于Linux用戶建議使用這個命令行-lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi帖池。沒有正確鏈接相應(yīng)的庫會產(chǎn)生undefined reference(未定義的引用)這個錯誤睡汹。

  • 記住確保你的頭文件和庫文件的目錄設(shè)置正確,以及鏈接器里引用的庫文件名正確寂殉。

額外的資源

Polytonic/Glitter: 一個簡單的樣板項目囚巴,它已經(jīng)提前配置了所有相關(guān)的庫;如果你想要很方便地搞到一個LearnOpenGL教程的范例工程友扰,這是一個很好的東西文兢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市焕檬,隨后出現(xiàn)的幾起案子姆坚,更是在濱河造成了極大的恐慌,老刑警劉巖实愚,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兼呵,死亡現(xiàn)場離奇詭異,居然都是意外死亡腊敲,警方通過查閱死者的電腦和手機击喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碰辅,“玉大人懂昂,你說我怎么就攤上這事∶槐觯” “怎么了凌彬?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長循衰。 經(jīng)常有香客問我铲敛,道長,這世上最難降的妖魔是什么会钝? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任伐蒋,我火速辦了婚禮,結(jié)果婚禮上迁酸,老公的妹妹穿的比我還像新娘先鱼。我一直安慰自己,他們只是感情好奸鬓,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布焙畔。 她就那樣靜靜地躺著,像睡著了一般全蝶。 火紅的嫁衣襯著肌膚如雪闹蒜。 梳的紋絲不亂的頭發(fā)上寺枉,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音绷落,去河邊找鬼姥闪。 笑死,一個胖子當(dāng)著我的面吹牛砌烁,可吹牛的內(nèi)容都是我干的筐喳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼函喉,長吁一口氣:“原來是場噩夢啊……” “哼避归!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起管呵,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤梳毙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捐下,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體账锹,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年坷襟,在試婚紗的時候發(fā)現(xiàn)自己被綠了奸柬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡婴程,死狀恐怖廓奕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響隐绵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朴皆,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一贴彼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窍育,春花似錦卡睦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乞娄,卻和暖如春瞬逊,著一層夾襖步出監(jiān)牢的瞬間显歧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工确镊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留士骤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓蕾域,卻偏偏與公主長得像拷肌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旨巷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容