通過GLEW訪問OpenGL函數(shù)
為了使用新版本的OpenGL,我們可以進(jìn)入到顯卡的驅(qū)動(dòng)dll文件里,檢索庫里面的函數(shù)的指針來調(diào)用他們,但首先這不是跨平臺(tái)的,所以到驅(qū)動(dòng)里拉取函數(shù),需要用到一些windows專用的API調(diào)用或者外來的windows加載庫,而且這些新版本OpenGL經(jīng)過迭代可能有1000多個(gè)函數(shù)需要我們手動(dòng)檢索并實(shí)現(xiàn),這相當(dāng)困難。所以我們直接用GLEW庫(也有其他庫,但GLEW是最簡單的),它只提供OpenGL的規(guī)范,包括函數(shù)的聲明,符號(hào)的聲明,常量等等,不提供任何實(shí)際代碼,只會(huì)訪問一些電腦中的二進(jìn)制形式的函數(shù)。
到GLEW官網(wǎng),出于學(xué)習(xí)OpenGL的目的,我們只需要下載二進(jìn)制文件。在VS項(xiàng)目屬性中分別添加附加包含目錄,附加庫目錄,附加依賴項(xiàng),根據(jù)經(jīng)驗(yàn)一般lib文件如果有帶s的,就是靜態(tài)庫。在doc文件夾中包含了相關(guān)的文檔,打開index.html可以在本地瀏覽跟官網(wǎng)相同的網(wǎng)頁。首先我們需要看文檔來搞清楚怎么用正確的方法來調(diào)用一個(gè)庫,而不是隨便做出一些假設(shè),因?yàn)檫@會(huì)導(dǎo)致一些奇怪的BUG(哪怕它暫時(shí)能運(yùn)行)。
在glew.h中找到glewInit();進(jìn)入GLEWAPI宏中,可以看到注釋,

GLEW_STATIC是用來定義靜態(tài)庫的,GLEW_BUILD用來定義構(gòu)建DLL庫的,現(xiàn)在我們沒有GLEW_STATIC和GLEW_BUILD的定義,所以這里定義GLEWAPI為extern __declspec(dllimport),這是一個(gè)內(nèi)在的MSVC編譯器,它會(huì)告訴鏈接器這是來自一個(gè)dll文件,需要dll引用,但現(xiàn)在我們用的是靜態(tài)庫,沒有用dll版本的glew,所以這樣寫代碼就會(huì)出錯(cuò)。解決這事的方法就是定義GLEW_STATIC,項(xiàng)目屬性->C/C++->預(yù)處理器->預(yù)處理器定義,添加GLEW_STATIC;

我們?cè)趃lfwMakeContextCurrent(window)之前調(diào)用glewInit(),它的返回值不等于GLEW_OK,因?yàn)楣俜轿臋n告訴我們需要在創(chuàng)建一個(gè)有效的OpenGL渲染上下文之后調(diào)用glewInit(),所以我們應(yīng)該在glfwMakeContextCurrent(window)之后調(diào)用glewInit(),如下:

這樣一來我們就能訪問所有的OpenGL函數(shù)了,在glew.h文件中可以找到它們。