OpenGL中的freeglut和glew的作用和區別
阿新 • • 發佈:2019-02-03
這兩個庫都是用於讓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是目前最新,也是最流行的庫。參考資料: