從0開(kāi)始的OpenGL學(xué)習(xí)(一)-創(chuàng)建OpenGL窗口

圖片資源來(lái)源于網(wǎng)絡(luò)

本文主要解決兩個(gè)問(wèn)題:

1侠仇、OpenGL到底是什么鬼轻姿?
2犁珠、如何創(chuàng)建一個(gè)使用OpenGL的窗口?

1互亮、OpenGL到底是什么鬼犁享?

筆者也算是一個(gè)入門的C++程序員了,一下決心要學(xué)習(xí)OpenGL之后就直接上谷歌搜了OpenGL的官網(wǎng)(當(dāng)然這是要翻越萬(wàn)里長(zhǎng)城的)豹休,想下一個(gè)API就上手炊昆。然而在官網(wǎng)上溜了一大圈,楞是沒(méi)找到一個(gè)下載API的地方威根,倒是在各種顯卡廠商的官網(wǎng)上都轉(zhuǎn)了一圈窑眯,灰頭土臉。

在網(wǎng)上找了很多資料之后医窿,終于明白了一點(diǎn),這也是非常重要的一點(diǎn)炊林,就是:OpenGL并不是一個(gè)API(API這個(gè)應(yīng)該懂吧姥卢,搞編程的人都知道。什么渣聚?你說(shuō)你不是搞編程的独榴?那你看這篇文章,還不速速出門右轉(zhuǎn)奕枝。)庫(kù),而是一組規(guī)范,這組規(guī)范是由Khronos Group來(lái)維護(hù)的辨嗽。(別問(wèn)我Khronos Group是什么鬼猜扮,對(duì)于只能寫入門文字的筆者來(lái)說(shuō),這也是第一次看到谭梗。)

這組規(guī)范定義了一組函數(shù)忘晤,這組函數(shù)傳入的是什么參數(shù),傳出的是什么結(jié)果激捏。由于只是這樣的一組規(guī)范设塔,所以只要合乎規(guī)范,誰(shuí)都能以不同的方式實(shí)現(xiàn)函數(shù)远舅。這也就是在官網(wǎng)上找不到API庫(kù)的原因了闰蛔,通常這些API是由顯卡廠商實(shí)現(xiàn)的。順便說(shuō)一句图柏,如果裝了VS序六,VS里自帶有OpenGL的庫(kù)(至少筆者的VS2013里有)。

狀態(tài)機(jī)

OpenGL本身就是一個(gè)大狀態(tài)機(jī):有很多變量可以設(shè)置以便我們控制其操作爆办。OpenGL的狀態(tài)通常被稱為上下文(context)难咕。我們?cè)诓僮鱋penGL的時(shí)候就是通過(guò)改變其狀態(tài)來(lái)改變其運(yùn)行的上下文,這樣OpenGL就能給我們想要的結(jié)果了。

2余佃、如何創(chuàng)建一個(gè)使用OpenGL的窗口暮刃?

2.1 所需工具

GLFW庫(kù)+VS2013+GLAD源碼

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

GLFW是一個(gè)開(kāi)源的跨平臺(tái)窗口庫(kù)爆土,它封裝了與操作系統(tǒng)相關(guān)的創(chuàng)建窗口的過(guò)程椭懊,讓我們的窗口創(chuàng)建只需要調(diào)用少量的函數(shù)就能實(shí)現(xiàn)。(媽媽再也不用擔(dān)心我不會(huì)創(chuàng)建窗口了)

VS2013步势,額氧猬,湊個(gè)字?jǐn)?shù),你懂的

GLAD源碼是用來(lái)封裝調(diào)用OpenGL庫(kù)中的函數(shù)的坏瘩,讓我們調(diào)用OpenGL函數(shù)的時(shí)候只需要用熟悉的函數(shù)調(diào)用方式盅抚,不需要?jiǎng)?chuàng)建一個(gè)函數(shù)指針,然后加載dll中的函數(shù)地址倔矾,然后再調(diào)用妄均。說(shuō)的有點(diǎn)抽象啊,舉個(gè)例子就知道了哪自。原本我們的代碼要是這個(gè)樣子:

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

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

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

2.2 環(huán)境打造:

第一步:下載GLFW

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

圖片資源來(lái)源于網(wǎng)絡(luò)

文件包名為glfw-3.2.1.zip

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

GLFW的源碼是需要通過(guò)CMake來(lái)編譯的,所以我們要下載一個(gè)CMake來(lái)使用胧华。放心寄症,CMake的使用非常方便。

官網(wǎng)地址是:https://cmake.org/download/(也需要翻墻才能訪問(wèn))矩动,下載最新版本3.9.3瘸爽,windows 32位版本,

圖片資源來(lái)源于網(wǎng)絡(luò)

安裝完成后铅忿,打開(kāi)CMake剪决,對(duì)其進(jìn)行如下設(shè)置

CMake的編譯設(shè)置

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

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

編譯器設(shè)置

點(diǎn)擊“Finish”渗鬼,在等待一段時(shí)間之后,出現(xiàn)如下界面


設(shè)置好編譯器之后

什么都不用管荧琼,直接點(diǎn)擊左下角的Generate按鈕譬胎,非巢钆#快速的進(jìn)度條之后,打開(kāi)解壓GLFW的目錄堰乔,就能看到VS2013版本的GLFW工程了


生成好工程的狀態(tài)

有些讀者在編譯的時(shí)候可能會(huì)出問(wèn)題偏化,筆者也不知道什么原因,在這里直接提供編譯好的庫(kù)供大家使用镐侯。

第三步:下載GLAD

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

選擇好要下載的版本

點(diǎn)擊頁(yè)面最下方右下角的GENERATE按鈕,在隨后彈出的頁(yè)面中,點(diǎn)擊glad.zip進(jìn)行下載


下載zip
第四步:組裝開(kāi)發(fā)庫(kù)目錄

新建一個(gè)文件夾苟翻,取名為OpenGL韵卤,將GLFW目錄中的include目錄復(fù)制到OpenGL目錄中去

在OpenGL文件夾下新建一個(gè)文件夾,取名為lib崇猫,將編譯好的GLFW庫(kù)復(fù)制到lib文件夾下沈条,GLFW庫(kù)的位置是:glfw-3.2.1\src,將里面的Debug和Release兩個(gè)目錄復(fù)制诅炉,拷貝到lib文件夾下拍鲤。

復(fù)制glad解壓文件夾中,include目錄下的兩個(gè)文件夾glad和KHR復(fù)制汞扎,拷貝到OpenGL目錄下,include文件夾中

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


OpenGL目錄

include文件夾下是這樣


include目錄

lib文件夾下是這樣


lib目錄
第五步:創(chuàng)建項(xiàng)目澈魄,設(shè)置路徑

用VS2013創(chuàng)建一個(gè)HelloWindow空項(xiàng)目工程,將glad文件夾下的glad.c文件拷貝到工程中仲翎,并將glad.c文件添加到項(xiàng)目中
打開(kāi)項(xiàng)目的屬性痹扇,選擇VC++目錄標(biāo)簽,設(shè)置包含目錄和庫(kù)目錄到我們之前設(shè)置的路徑下溯香,如圖


工程目錄設(shè)置

注意debug是這樣設(shè)置鲫构,Release的話將庫(kù)目錄指定到Release目錄就可以了

Release目錄設(shè)置

點(diǎn)擊鏈接器,選擇輸入標(biāo)簽玫坛,在附加依賴項(xiàng)中加入opengl32.lib;glfw3.lib;兩項(xiàng)结笨,Debug和Release模式下名字是一樣的

確定,這樣我們的項(xiàng)目設(shè)置就完成了湿镀。

第六步:創(chuàng)建窗口

添加cpp文件炕吸,取名為main.cpp,在main函數(shù)中加入如下代碼

主函數(shù)代碼

其中framebuffer_size_callback和processInput是兩個(gè)處理消息的函數(shù)

framebuffer_size_callback用于當(dāng)窗口大小改變時(shí)勉痴,改變OpenGL視口的區(qū)域大小

processInput函數(shù)處理輸入事件

兩個(gè)函數(shù)的實(shí)現(xiàn)如下:


子函數(shù)代碼

編譯項(xiàng)目赫模,運(yùn)行就成功了

運(yùn)行效果圖

好了,到此為止蒸矛,我們已經(jīng)成功創(chuàng)建了一個(gè)使用OpenGL的窗口瀑罗,萬(wàn)里長(zhǎng)征終于走出了第一步胸嘴。歇口氣,休息一會(huì)再學(xué)下一章!

下一篇
目錄

參考資料:

learnopengl.com(這是一個(gè)非常不錯(cuò)的網(wǎng)站斩祭,筆者就是在這個(gè)網(wǎng)站上學(xué)的劣像,這一系列的文章大部分是參考這里的內(nèi)容,強(qiáng)烈推薦想學(xué)的小伙伴去這里學(xué))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末停忿,一起剝皮案震驚了整個(gè)濱河市驾讲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌席赂,老刑警劉巖吮铭,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颅停,居然都是意外死亡谓晌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門癞揉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纸肉,“玉大人,你說(shuō)我怎么就攤上這事喊熟“胤荆” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵芥牌,是天一觀的道長(zhǎng)烦味。 經(jīng)常有香客問(wèn)我,道長(zhǎng)壁拉,這世上最難降的妖魔是什么谬俄? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮弃理,結(jié)果婚禮上溃论,老公的妹妹穿的比我還像新娘。我一直安慰自己痘昌,他們只是感情好钥勋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著辆苔,像睡著了一般笔诵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姑子,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天乎婿,我揣著相機(jī)與錄音,去河邊找鬼街佑。 笑死谢翎,一個(gè)胖子當(dāng)著我的面吹牛捍靠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播森逮,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼榨婆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了褒侧?” 一聲冷哼從身側(cè)響起良风,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闷供,沒(méi)想到半個(gè)月后烟央,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歪脏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年疑俭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婿失。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钞艇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豪硅,到底是詐尸還是另有隱情哩照,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布懒浮,位于F島的核電站飘弧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嵌溢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一蹋岩、第九天 我趴在偏房一處隱蔽的房頂上張望赖草。 院中可真熱鬧,春花似錦剪个、人聲如沸秧骑。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乎折。三九已至,卻和暖如春侵歇,著一層夾襖步出監(jiān)牢的瞬間骂澄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工惕虑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坟冲,地道東北人磨镶。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像健提,于是被迫代替她去往敵國(guó)和親琳猫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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