OpenGL SDK glew(OpenGL Extension Wrangler Library )
現在我才知道opengl從3.0開始,所有實現全部由顯卡廠商提供。而官方組織只是發布標準而已,由于沒有這點兒認知,害的我到處找dll。GLEW是一個跨平臺的C++擴展庫,基于OpenGL圖形接口。使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵數,但OpenGL現在都發展到2.0以上了,要使用這些OpenGL的高級特性,就必須下載最新的擴展,另外,不同的顯卡公司,也會發布一些只有自家顯卡才支持的擴展函數,你要想用這數涵數,不得不去尋找最新的glext.h,有了GLEW擴展庫,你就再也不用為找不到函數的接口而煩惱,因為GLEW能自動識別你的平臺所支持的全部OpenGL高級擴展涵數。也就是說,只要包含一個glew.h頭文件,你就能使用gl,glu,glext,wgl,glx的全部函數。GLEW支持目前流行的各種操作系統(including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris)。
?
(1)尋找缺失的 OpenGL 函數?
OpenGL 是由顯卡直接支持并實現的,當時在設計的時候考慮到顯卡廠商可能會比操作系統 / 開發軟件制造商先行一步提供新的擴展,所以有提供獲取新的擴展的方法,在 Windows 下就是利用 wglGetProcAddress 函數:
此函數與 GetProcAddress 功能類似,實現也類似,無非就是從動態庫中通過名字直接獲取到函數的地址。
FARPROC WINAPI GetProcAddress(__in HMODULE hModule ,__in LPCSTR lpProcName );因為 wglGetProcAddress 很明確的知道該從哪個 Dll 獲取函數,所以省略了第一參數模塊名,僅僅通過函數名就能獲取到對應的函數地址,使用方法也是類似,通過函數名獲取到函數地址后,通過強制轉換的方式使用。此方法雖然可行,但是用到大量函數的時候比較麻煩。事實上,此方法提供的時候是作為一種補充的手段,是在顯卡生廠商走在操作系統和開發工具提供商前面時的一種暫時應付手段,但是,很不幸的是, Windows 是在落后太多了。MS 當年作為 OpenGL 的發起人之一,僅僅對 OpenGL 支持到 1.1 ,然后就退出了 OpenGL 組織,自己發展 DirectX 系統去了,我們要在 Windows 上使用 OpenGL 光靠 MS 的話,那么 OpenGL 1.1 后的所有函數都得通過上述手段來完成,那簡直是讓人吐血的事情 -_-! Glew實際上為我們做了上述的所有事情!配置好Glew后以后在使用 OpenGL 的時候,都請通過下述代碼找到OpenGL1.1 以上的函數。
#include <GL/glew.h> //包含必要的頭文件 #include <GL/wglew.h> #pragma comment ( lib , "glew32.lib" ) //鏈接時加入庫文件 #pragma comment ( lib , "glew32s.lib" )然后,在初始化 OpenGL 的時候,不要忘了將 glew 初始化,可以這樣:
GLenum err = glewInit (); if (err != GLEW_OK ) {exit (-2); }這樣就能使用缺失的函數,就像它們原來就被操作系統支持那樣,而不用自己通過 wglGetProcAddress 去獲取了,說是能像原來就被操作系統支持的那樣使用其實不完成正確,起碼在 VS 中,由于都是通過強轉后的函數指針使用, VS 和 VA 都不能正確的解析其函數原型,使得代碼編寫時智能提醒函數原型的功能不能正常使用,這也算是個小瑕疵吧。
?
(2)Glew的安裝和使用
推薦將頭文件放在 Visual studio 的 include/GL 目錄下(可以通過找到 gl/gl.h 的位置找到), lib 放在Visual studio 的 lib 目錄下,動態庫放到 windows/system32 這個系統目錄下,那么以后的 OpenGL 工程就不需要額外的配置了。當然也可以通過“附加包含路徑”指定包含頭文件的目錄和“附加庫路徑”來指定包含庫文件的目錄。包含了 glut 后,基本上 Win32 下 OpenGL 的工程可以以下面的代碼開始了:
#include <GL/glew.h> #include <GL/wglew.h> #include <GL/glut.h> #pragma comment ( lib , "opengl32.lib" ) #pragma comment ( lib , "glu32.lib" ) #pragma comment ( lib , "glew32.lib" ) #pragma comment ( lib , "glew32s.lib" ) #pragma comment ( lib , "glut32.lib" )這些都是必須的。(事實上由于glut32.lib會自動的包含OpenGL核心所需的庫,包含glut32.lib時可以省略opengl32.lib和glu32.lib)
下面是一個完整的實例,其中的宏 GL_VERSION_1_3 是由 glew 定義用來表示支持 OpenGL1.3 版本,其中的函數 glMultiDrawElementsEXT 就是 Windows 本身不支持,用了 glew 后才能使用的 OpenGL 擴展接口(首先要顯卡支持啊)。
#include <GL/glew.h> #include <GL/wglew.h> #include <GL/glut.h> #include <stdio.h>#pragma comment ( lib , "opengl32.lib" ) #pragma comment ( lib , "glu32.lib" ) #pragma comment ( lib , "glew32.lib" ) #pragma comment ( lib , "glew32s.lib" ) #pragma comment ( lib , "glut32.lib" ) #ifdef GL_VERSION_1_3void setupPointer (void ){ static GLint vertices [] = {25, 25, 75, 75, 100, 125, 150, 75, 200, 175, 250, 150, 300, 125, 100, 200, 150, 250, 200, 225, 250, 300, 300, 250}; glEnableClientState (GL_VERTEX_ARRAY ); glVertexPointer (2, GL_INT , 0, vertices ); }void init (void ){ GLenum err = glewInit (); if (err != GLEW_OK ) { exit (-2); } glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH ); setupPointer (); }void display (void ) { static GLubyte oneIndices [] = {0, 1, 2, 3, 4, 5, 6}; static const GLubyte twoIndices [] = {1, 7, 8, 9, 10, 11}; static GLsizei count [] = {7, 6}; static const GLvoid * indices [2] = {oneIndices , twoIndices }; glClear (GL_COLOR_BUFFER_BIT ); glColor3f (1.0, 1.0, 1.0); glMultiDrawElementsEXT (GL_LINE_STRIP , count , GL_UNSIGNED_BYTE , indices , 2); // 上面的一句相當于下面的兩句 //glDrawElements(GL_LINE_STRIP, count[0], GL_UNSIGNED_BYTE, oneIndices); //glDrawElements(GL_LINE_STRIP, count[1], GL_UNSIGNED_BYTE, twoIndices); glFlush (); }void reshape (int w , int h ) { glViewport (0, 0, (GLsizei ) w , (GLsizei ) h ); glMatrixMode (GL_PROJECTION ); glLoadIdentity (); gluOrtho2D (0.0, (GLdouble ) w , 0.0, (GLdouble ) h ); }void keyboard (unsigned char key , int x , int y ) { switch (key ) { case 27: exit (0); break ; } }int main (int argc , char ** argv ) { glutInit (&argc , argv ); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB ); glutInitWindowSize (350, 350); glutInitWindowPosition (100, 100); glutCreateWindow (argv [0]); init (); glutDisplayFunc (display ); gutReshapeFunc (reshape ); glutKeyboardFunc (keyboard ); glutMainLoop (); return 0; } #else int main(int argc, char** argv) { fprintf (stderr, "This program demonstrates a feature which is not in OpenGL Version 1.0.\n"); fprintf (stderr, "If your implementation of OpenGL Version 1.0 has the right extensions,\n"); fprintf (stderr, "you may be able to modify this program to make it run.\n"); return 0; } #endif
?
總結
以上是生活随笔為你收集整理的OpenGL SDK glew(OpenGL Extension Wrangler Library )的全部內容,希望文章能夠幫你解決所遇到的問題。