如何使用OpenGL擴展(轉)

如何使用OpenGL擴展(轉)
2007-11-29 22:19

2007-04-15 21:12

如果你在Windows平臺下開發OpenGL程序,那麼系統中自帶的OpenGL庫就是1.1的,如果想使用1.2或者更高版本的OpenGL庫,那麼只能使用OpenGL擴展,在網上關於如何使用OpenGL擴展的文章很多,但是多數都是簡單帶過,抄來抄去,很少有實際的代碼,我當時也遇到過同樣的問題,幾經周折終於找到了解決辦法,不敢獨享,拿出來與大家分享,如果有什麼不當之處,一定告訴我,感激不盡!

一. 概念的澄清

經常會看到論壇裏面有人這樣問:

         哪裏能下載OpenGL2.0的頭文件和庫文件?

其實,對於一個剛剛接觸OpenGL的新手來說,如果是在Windows平臺下開發,這個問題是一定會經歷的,爲什麼呢?因爲很多參考書上都會提到OpenGL2.0,但是微軟對OpenGL的支持只到1.11.1以後微軟就不再支持了,爲什麼,因爲微軟更想發展自家的DirectX。所以如果想使用OpenGL1.1以上的功能或者函數,只能使用OpenGL擴展,這些擴展是一些OpenGL團體或個人開發出來的能Windows上使用的OpenGL1.1以後的一些功能及函數。所以,在Windows上根本就沒有什麼OpenGL2.0的頭文件或庫文件了,OpenGL1.1以後的東西都已經以擴展的形式存在了,而且,並沒有一個統一的標準,你可以使用glexglewglee等等。下面我給出兩種常用的方法:

         大多數人都是在運行紅寶書中的程序時遇到這個問題,比如這個函數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擴展。

三. 使用擴展函數

在判斷了顯卡所支持的擴展以後,就可以使用該擴展中所包含的函數了下面詳細介紹兩種使用擴展函數的具體方法:

使用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 ;

如果覺得上面的方法麻煩,那麼可以使用下面的方法:我推薦這種方法:

1.   使用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) ;

         }

.在project->setting中,打開link選項卡,加上glew.lib 
或在文件中加上#progmma comment(lib, "glew.lib")

好了,現在可以放心使用擴展了,趕快繼續你的OpenGL之旅吧!

說明:上面的鏈接都是國外的官方站點鏈接,所以如果上不去外網,我可以給大家傳一份

再提供幾個好一點的OpenGL站點:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章