如果你在Windows平台下開發OpenGL程式,那麼系統中內建的OpenGL庫就是1.1的,如果想使用1.2或者更高版本的OpenGL庫,那麼只能使用OpenGL擴充,在網上關於如何使用OpenGL擴充的文章很多,但是多數都是簡單帶過,抄來抄去,很少有實際的代碼,我當時也遇到過同樣的問題,幾經周折終於找到瞭解決辦法,不敢獨享,拿出來與大家分享,如果有什麼不當之處,一定告訴我,感激不盡!
一. 概念的澄清
經常會看到論壇裡面有人這樣問:
哪裡能下載OpenGL2.0的標頭檔和庫檔案?
其實,對於一個剛剛接觸OpenGL的新手來說,如果是在Windows平台下開發,這個問題是一定會經曆的,為什麼呢?因為很多參考書上都會提到OpenGL2.0,但是微軟對OpenGL的支援只到1.1,1.1以後微軟就不再支援了,為什麼,因為微軟更想發展自家的DirectX。所以如果想使用OpenGL1.1以上的功能或者函數,只能使用OpenGL擴充,這些擴充是一些OpenGL團體或個人開發出來的能Windows上使用的OpenGL1.1以後的一些功能及函數。所以,在Windows上根本就沒有什麼OpenGL2.0的標頭檔或庫檔案了,OpenGL1.1以後的東西都已經以擴充的形式存在了,而且,並沒有一個統一的標準,你可以使用glex,glew,glee等等。下面我給出兩種常用的方法:
大多數人都是在運行紅寶書中的程式時遇到這個問題,比如這個函數glBlendEquation,它就是GL_ARB_imaging擴充中的一個函數。所以,在使用一個擴充之前,首先要做的就是判斷你的顯卡是否支援該擴充。
二. 如何判斷顯卡所支援的擴充:
使用函數glGetString,看一下它的原型:
const GLubyte * glGetString( GLenum name )
我們以GL_EXTENSIONS為參數調用該函數,就能獲得當前顯卡所支援的所有擴充,像下面這樣:
const GLubyte *str = glGetString(GL_EXTENSIONS) ;
cout << str << endl ;
輸出的各個擴充之間以空格分隔,如果這些擴充中包含GL_ARB_imaging,那麼你就可以使用glBlendEquation這個函數了。
當然,這樣查詢的只是gl擴充,還可以用gluGetString獲得glu擴充。
三. 使用擴充函數
在判斷了顯卡所支援的擴充以後,就可以使用該擴充中所包含的函數了下面詳細介紹兩種使用擴充函數的具體方法:
1.使用glext
這裡下載:(http://graphics.ethz.ch/pointshop3d/sourcedoc/html/glext_8h-source.html)
a)標頭檔的包含 這個檔案並不是Windows系統中原有的,需要到網上下載。使用的時候有一點要注意,如果程式中還用到了glut.h檔案,那麼一定要把glext.h放在glut.h的後面,因為glext.h要用到gl.h,而glut.h中包含了gl.h,如果順序搞錯了,編譯的時候會有一大堆錯誤,正確的順序如下:
#include <iostream>
#include <windows.h>
#include <GL/glut.h>
#include <GL/glext.h>
b)擷取函數指標
先定義函數指標,PFNGLBLENDEQUATIONPROC glBlendEquation = NULL;
再擷取函數地址, 使用wglGetProcAddress函數,注意這一句要加在使用glBlendEquation函數的語句之前才有效,最後後面緊跟著使用glBlendEquation的函數語句,切記不要加在所有子程式的外面,否則擷取的指標是無效的
glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");
例如可以這樣加:
PFNGLBLENDEQUATIONPROC glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");
switch(key)
{
case 'a':
case 'A':
//Note: glBlendEquation is a subset of GL_ARB_imaging, please call glGetString
//first to confirm whether your video card support this extension.
glBlendEquation(GL_FUNC_ADD) ;
break ;
case 's':
case 'S':
glBlendEquation(GL_FUNC_SUBTRACT) ;
break ;
如果覺得上面的方法麻煩,那麼可以使用下面的方法:我推薦這種方法:
2. 使用glew
glew也是一個擴充庫,包含了OpenGL中許多核心及擴充函數,現在的版本是1.3.5,支援OpenGL2.1,可以到這裡下載:
http://glew.sourceforge.net/
上面的方法可能有些麻煩,如果已經下載了glew庫的話,那麼可以直接使用該擴充,但是使用之前首先要確定你的顯卡是否支援該擴充。方法如下:首先還是要判斷顯卡是否支援該擴充,我們這裡假定已經支援,
1.包含標頭檔glew.h,注意這裡和上面不同,這回glut.h要放在glew.h的後面了
像下面這樣
#include <GL/glew.h>
#include <GL/glut.h>
然後就可以在程式中直接使用glBlendEquation了,其他擴充的判斷和使用方法與此類似。
最後還有一點切記!那就是還要調用glewInit() ;來初始化一下方可使用擴充,如下:
GLenum err = glewInit() ;
if (GLEW_OK != err)
{
MessageBoxA(NULL, "error", "My Window", 1) ;
}
好了,現在可以放心使用擴充了,趕快繼續你的OpenGL之旅吧!
說明:上面的連結都是國外的官方站台連結,所以如果上不去外網,我可以給大家傳一份
再提供幾個好一點的OpenGL網站:
第一位:當然是http://www.opengl.org/
第二位:入門的好網站:http://www.opengl.org/wiki/index.php/Main_Page
上面兩種方法的完整代碼請看一下篇.