創(chuàng)建窗口
在畫出效果之前,我們需要?jiǎng)?chuàng)建一個(gè)OpenGL上下文和一個(gè)用于顯示的窗口。然而售滤,這些操作在不同平臺(tái)上是不一樣的。
幸運(yùn)的是台诗,有一些庫已經(jīng)提供了我們所需的功能完箩,其中一部分就是特別針對OpenGL的。這些庫能省去我們書寫操作系統(tǒng)相關(guān)代碼的時(shí)間(例如創(chuàng)建window窗口拉队,實(shí)際需要調(diào)用window下系統(tǒng)API)弊知,提供給我們一個(gè)窗口和上下文用于渲染。最流行的幾個(gè)庫有GLUT粱快,SDL秩彤,SFML和GLFW。這里使用教程中推薦的GLFW皆尔。
GLFW相關(guān)源碼編譯操作生成lib略過呐舔,具體可查看教程中詳細(xì)描述币励。
GLAD
GLFW安裝成功后還沒結(jié)束慷蠕,我們?nèi)杂屑氯プ觥R驗(yàn)镺penGL僅僅是個(gè)規(guī)范食呻,具體的實(shí)現(xiàn)是由驅(qū)動(dòng)開發(fā)商針對特定顯卡實(shí)現(xiàn)的流炕。由于OpenGL驅(qū)動(dòng)版本眾多,它的大多數(shù)函數(shù)的位置是無法在編譯時(shí)就確定下來的仅胞,需要在運(yùn)行時(shí)查詢每辟。所以任務(wù)就落在了開發(fā)者身上,開發(fā)者需要在運(yùn)行時(shí)獲取函數(shù)地址并將其保存在一個(gè)函數(shù)指針中供以后使用干旧。取得地址的方法因平臺(tái)而異渠欺,在Windows上會(huì)是類似這樣:
// 定義函數(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);
可以看出這樣做十分繁瑣,我們需要針對每個(gè)可能使用的函數(shù)重復(fù)上面的過程椎眯。運(yùn)的是挠将,有些庫能簡化此過程,其中GLAD是目前最新编整,也是最流行的庫舔稀。
GLAD庫具體配置略過,相比于GLFW掌测,其配置更加簡單内贮。