2013-03-28 59 views
0

我想在Windows下使用OpenGL的霧座標擴展。以下是我的代碼的前幾行:在Windows中的OpenGL霧座標擴展

#include <windows.h> 
#include <gl\glut.h> 
#include "GLEXT.h" 

#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450  
#define GL_FOG_COORDINATE_EXT  0x8451     

PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL; 

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT"); 

如果這樣,編譯器會提示glFogCoordfEXT找不到。但有一次我把

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT"); 

之前霧參數設置,編譯通過和程序運行良好。

雖然我使用Windows很多,但我並不熟悉Windows特定的函數調用。誰能告訴我這是如何工作的?

回答

0

在Microsoft Windows上,您可以使用一個庫(.lib之一)進行編譯,並使用不同的庫(您的.dll之一)運行。 Microsoft控制編譯庫的內容,但供應商能夠替換運行庫。在OpenGL的情況下,編譯庫相當陳舊(僅支持OpenGL 1.1函數和一些擴展),並且由於該庫提供了編譯器鏈接所需的導出函數,因此不包括新的OpenGL函數。因此,需要使用函數指針,因爲它們可以在運行時從.dll中檢索。函數wglGetProcAddress()確實具有檢索功能,並且您以大寫字母(例如PFNGLFOGCOORDFEXTPROC)顯示的所有這些類型都是您可以通過wglGetProcAddress()獲得的函數的typedef。因此,爲了使用glFogCoordfEXT()函數,您需要在調用它之前從.dll中檢索它。通常,您應該收集您需要使用的所有函數,以便在程序開始時(但是在創建OpenGL上下文後)使用wglGetProcAddress()來獲取初始化代碼。

還有一點:你應該確認OpenGL的相應版本可用(通過調用glGetString(GL_VERSION),任何擴展可能需要的支持(通過調用glGetString(GL_EXTENSIONS)和解析字符串,或者如果您使用的是更最近的OpenGL,請致電glGetStringi()獲取單個擴展字符串)wglGetProcAddress()將返回NULL如果該函數在OpenGL實現中不可用,它將返回一個有效的函數指針可用,但這並不一定意味着您需要的功能是(這就是爲什麼你應該檢查擴展字符串)。這種情況很少見,但可能由於擴展交互而發生。

+0

或者你也可以使用[pro每個OpenGL加載庫](http://www.opengl.org/wiki/OpenGL_Loading_Library)而不必關心。 –

+0

這確實是最簡單的答案。 – radical7