本文主要解決兩個問題:
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,對其進行如下設置
將源文件的目錄和要生成的編譯工程文件的目錄設置好,設置成相同的目錄就可以了。我們將其設置成解壓后的根目錄。
點擊左下角的Configure按鈕,在彈出的窗口的選擇編譯器中選擇“Visual Studio 12 2013”,如下圖
點擊“Finish”,在等待一段時間之后,出現如下界面
什么都不用管,直接點擊左下角的Generate按鈕,非常快速的進度條之后,打開解壓GLFW的目錄,就能看到VS2013版本的GLFW工程了
有些讀者在編譯的時候可能會出問題,筆者也不知道什么原因,在這里直接提供編譯好的庫供大家使用。
第三步:下載GLAD
官網地址:http://glad.dav1d.de/(繼續翻),選擇好需要的版本和模式
點擊頁面最下方右下角的GENERATE按鈕,在隨后彈出的頁面中,點擊glad.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文件夾下是這樣子
include文件夾下是這樣
lib文件夾下是這樣
第五步:創建項目,設置路徑
用VS2013創建一個HelloWindow空項目工程,將glad文件夾下的glad.c文件拷貝到工程中,并將glad.c文件添加到項目中
打開項目的屬性,選擇VC++目錄標簽,設置包含目錄和庫目錄到我們之前設置的路徑下,如圖
注意debug是這樣設置,Release的話將庫目錄指定到Release目錄就可以了
點擊鏈接器,選擇輸入標簽,在附加依賴項中加入opengl32.lib;glfw3.lib;兩項,Debug和Release模式下名字是一樣的
確定,這樣我們的項目設置就完成了。
第六步:創建窗口
添加cpp文件,取名為main.cpp,在main函數中加入如下代碼
其中framebuffer_size_callback和processInput是兩個處理消息的函數
framebuffer_size_callback用于當窗口大小改變時,改變OpenGL視口的區域大小
processInput函數處理輸入事件
兩個函數的實現如下:
編譯項目,運行就成功了
好了,到此為止,我們已經成功創建了一個使用OpenGL的窗口,萬里長征終于走出了第一步。歇口氣,休息一會再學下一章!
參考資料:
learnopengl.com(這是一個非常不錯的網站,筆者就是在這個網站上學的,這一系列的文章大部分是參考這里的內容,強烈推薦想學的小伙伴去這里學)