本文主要解決兩個(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))
選擇下載源文件壤巷,
文件包名為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位版本,
安裝完成后铅忿,打開(kāi)CMake剪决,對(duì)其進(jìn)行如下設(shè)置
將源文件的目錄和要生成的編譯工程文件的目錄設(shè)置好,設(shè)置成相同的目錄就可以了檀训。我們將其設(shè)置成解壓后的根目錄柑潦。
點(diǎn)擊左下角的Configure按鈕,在彈出的窗口的選擇編譯器中選擇“Visual Studio 12 2013”峻凫,如下圖
點(diǎn)擊“Finish”渗鬼,在等待一段時(shí)間之后,出現(xiàn)如下界面
什么都不用管荧琼,直接點(diǎn)擊左下角的Generate按鈕譬胎,非巢钆#快速的進(jìn)度條之后,打開(kāi)解壓GLFW的目錄堰乔,就能看到VS2013版本的GLFW工程了
有些讀者在編譯的時(shí)候可能會(huì)出問(wèn)題偏化,筆者也不知道什么原因,在這里直接提供編譯好的庫(kù)供大家使用镐侯。
第三步:下載GLAD
官網(wǎng)地址:http://glad.dav1d.de/(繼續(xù)翻)侦讨,選擇好需要的版本和模式
點(diǎn)擊頁(yè)面最下方右下角的GENERATE按鈕,在隨后彈出的頁(yè)面中,點(diǎn)擊glad.zip進(jìn)行下載
第四步:組裝開(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文件夾下是這樣子
include文件夾下是這樣
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è)置的路徑下溯香,如圖
注意debug是這樣設(shè)置鲫构,Release的話將庫(kù)目錄指定到Release目錄就可以了
點(diǎn)擊鏈接器,選擇輸入標(biāo)簽玫坛,在附加依賴項(xiàng)中加入opengl32.lib;glfw3.lib;兩項(xiàng)结笨,Debug和Release模式下名字是一樣的
確定,這樣我們的項(xiàng)目設(shè)置就完成了湿镀。
第六步:創(chuàng)建窗口
添加cpp文件炕吸,取名為main.cpp,在main函數(shù)中加入如下代碼
其中framebuffer_size_callback和processInput是兩個(gè)處理消息的函數(shù)
framebuffer_size_callback用于當(dāng)窗口大小改變時(shí)勉痴,改變OpenGL視口的區(qū)域大小
processInput函數(shù)處理輸入事件
兩個(gè)函數(shù)的實(shí)現(xiàn)如下:
編譯項(xiàng)目赫模,運(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é))