1. 程式人生 > >OpenGL中的freeglut和glew的作用和區別

OpenGL中的freeglut和glew的作用和區別

這兩個庫都是用於讓OpenGL程式編寫更簡單,下載連結:freeglut和glew

一,為什麼需要freeglut和glew

Before you can actually use OpenGL in a program, you must first initialize it. Because OpenGL is platform-independent,
there is not a standard way to initialize OpenGL; each platform handles it differently. Non-C/C++ language bindings can also
 handle these differently.There are two phases of OpenGL initialization. The first phase is the creation of an ;
the second phase is to load all of the necessary functions to use OpenGL. Some non-C/C++ language bindings merge these into one.
大概意思就是說,在你真正能夠在程式中使用OpenGL之前,你需要對他進行初始化,但是由於OpenGL是跨平臺的,所以也沒有一個標準的方式
進行初始化。OpenGL初始化分為兩個階段:
第一個階段,你需要建立一個OpenGL上下文環境,這個上下文環境儲存了所有與OpenGL相關的狀態(OpenGL是一個狀態機),上下文位於操作
系統中某個程序中,一個程序可以建立多個上下文,每一個上下文都可以描繪一個不同的可視介面,就像應用程式中的視窗;簡單來理解就是為了建立
一個視窗;
第二個階段,你需要定位所有需要在OpenGL中使用的函式,這是為什麼呢?後面會繼續討論;
自然,freeglut和glew就是用來解決這兩個問題的;
二,freeglut的作用
因為OpenGL是跨平臺的,這給開發者帶來了方便,但是在建立上下文時這也是一個麻煩的地方,因為不同平臺的視窗系統和API都是不一樣的
freeglut就是一個openGL的工具庫,封裝了各個平臺初始化視窗的過程,開發者只需要呼叫這個庫中的初始化函式即可建立一個上下文;
三,glew的作用
因為OpenGL只是一個標準/規範,具體的實現是由驅動開發商針對特定顯示卡實現的。由於OpenGL驅動版本眾多,它大多數函式的
位置都無法在編譯時確定下來,需要在執行時查詢。任務就落在了開發者身上,開發者需要在執行時獲取函式地址並將其儲存在一個函式指
針中供以後使用。取得地址的方法因平臺而異,在Windows上會是類似這樣:
// 定義函式原型typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);// 找到正確的函式並賦值給函式指標GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");// 現在函式可以被正常呼叫了GLuint buffer;glGenBuffers(1, &buffer);	你可以看到程式碼非常複雜,而且很繁瑣,我們需要對每個可能使用的函式都要重複這個過程。幸運的是,有些庫能簡化此過程,
GLEW是目前最新,也是最流行的庫。
參考資料: