2008-08-18 81 views

回答

19

簡易解決方案:使用GLEW。看看如何here

硬解: 如果你有一個真正強大的原因不使用GLEW,這裏是如何實現相同:

確定的OpenGL擴展和您希望使用的擴展API。 OpenGL擴展在OpenGL Extension Registry中列出。

例如:我希望使用EXT_framebuffer_object擴展的功能。我想從這個擴展使用的API有:

glGenFramebuffersEXT() 
glBindFramebufferEXT() 
glFramebufferTexture2DEXT() 
glCheckFramebufferStatusEXT() 
glDeleteFramebuffersEXT() 

檢查,如果你的顯卡支持您要使用的擴展名。如果是這樣,那麼你的工作即將完成!爲您的圖形卡下載並安裝最新的驅動程序和SDK。

示例:我的電腦中的顯卡是NVIDIA 6600 GT。所以,我訪問了NVIDIA OpenGL Extension Specifications網頁,發現支持EXT_framebuffer_object擴展。然後我下載最新的NVIDIA OpenGL SDK並安裝它。

你的圖形卡製造商提供了使用支持的OpenGL擴展所需的所有聲明一個glext.h頭文件(或類似名稱的頭文件)。 (注意並不是所有的擴展都可以被支持。)把這個頭文件放在你的編譯器可以撿起的地方,或者把它的目錄包含在編譯器的include目錄列表中。

在您的代碼中添加一個#include <glext.h>行以將頭文件包含到您的代碼中。

打開glext.h,找到你想使用和搶API及其相應難看聲明。

例子:我搜索上述幀緩衝的API,找到自己相應的難看聲明:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); 

所有這一切都意味着,你的頭文件中有2種形式的API聲明。一個是wgl式的醜陋函數指針聲明。另一個是一個理智的功能聲明。

對於您希望使用的每個擴展API,請將函數名稱的代碼聲明添加爲醜陋外觀字符串的類型。

例子:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; 
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; 
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; 
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; 
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; 

雖然長相醜陋,我們所做的是聲明對應於擴展API類型的函數指針。

用正確的函數初始化這些函數指針。這些功能由圖書館或司機公開。我們需要使用wglGetProcAddress()函數來做到這一點。

例子:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT"); 
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT"); 
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT"); 
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT"); 
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT"); 

不要忘記檢查函數指針NULL。如果碰巧wglGetProcAddress()找不到擴展函數,它會用NULL初始化指針。

例子:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT 
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT) 
{ 
    // Extension functions not loaded! 
    exit(1); 
} 

就是這樣,我們就大功告成了!您現在可以使用這些函數指針,就好像函數調用一樣。

例子:

glGenFramebuffersEXT(1, &fbo); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0); 

參考:Moving Beyond OpenGL 1.1 for Windows由戴維·阿瑟爾 - 這篇文章是有點過時,但你要明白爲什麼這個可憐的情況在Windows和存在的所有信息如何繞過它。

+0

我花了整整一天的時間試圖讓OpenGL與GLEW一起工作,但我一直在遇到問題......只是讓你知道:OpenGL並不是那麼容易設置。但是當它運行時:P – 2014-09-11 14:27:07

0

@Kronikarz:從外觀上看,GLEW似乎是未來的方式。 NVIDIA已將其與其OpenGL SDK一起發貨。它的最新版本是2007年與2006年的GLEE相比。

但是,這兩個庫的用法看起來幾乎與我相同。 (GLEW有一個init(),但在其他任何事情之前需要調用它。)所以,除非你發現某些擴展在GLEE下不受支持,否則不需要切換。

+0

最新的GLEW版本是從2012年8月6日起的1.9.0。 – 2012-09-01 22:59:53

3

不使用GLEW的'非常強大的原因'可能是您的編譯器/ IDE不支持該庫。例如:Borland C++ Builder。

在這種情況下,您可能需要從源重建庫。如果它起作用,那麼很好,否則手動擴展加載不會像聲音一樣糟糕。

0

GL3W是一個公共域腳本,用於創建僅加載OpenGL 3/4的核心功能的庫。它可以在github上找到:

https://github.com/skaslev/gl3w

GL3W需要Python 2。6爲OpenGL生成庫和頭文件;之後它不需要Python。