2009-06-19 22 views
7

我正要在Windows下的Dev-C++中重建我的庫;但是,我在此期間添加的着色器功能不受支持,編譯器無法找到相關函數(:: glCreateShader(),:: glCreateProgram()等)。使用Dev-C++和SDL的OpenGL v2.0着色器?

在互聯網和Dev-C++文件夾,我發現OpenGL實現(gl.h)只有v1.1。我找到recommendationsSGI下載最新的標頭。我發現了gl3.h,但是經過更仔細的審查之後,我意識到gl.h並不包含在我的項目中,我應該看看SDL/SDL_opengl.h。

編輯: SDL_opengl.h 包括gl.h 宣佈的有關函數的原型。所以問題是,爲什麼我給出編譯時錯誤而不是鏈接器錯誤?

(我的圖書館只對鏈接的mingw32,libOpenGL32,libSDL,libSDL_Image和libSDL_Mixer,就像OSX下(除mingw32的,當然),我沒有任何問題的。)

如何使用使用Dev-C++和SDL的OpenGL v2.0着色器?

+0

爲什麼要在地球上使用Dev-C++?幫你一個忙,並使用在過去4年中已更新的IDE。 (並且它沒有bug,並且即使在支持*時也缺少功能) – jalf 2009-06-19 14:28:22

+0

爲什麼選擇Dev-C++而不是VC++ 2008 Express? – 2009-06-19 14:30:49

回答

8

gl.h只對OpenGL 1.1(以及在某些情況下高達1.3,這取決於版本您正在使用的文件和操作系統)。對於其他一切,您還需要glext.h,可能還有glxext.h(Linux/Unix)或wglext.h(Windows)。

OpenGL的新版本的所有函數都必須在運行時鏈接。所以爲了使用它們,你必須得到正確的函數地址並將其分配給一個函數指針。最簡單的方法是使用類似GLEW的東西。

手動的方法是這樣的:

PFNGLCREATESHADERPROC glCreateShader = NULL; 
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader"); 

或用於Linux:

PFNGLCREATESHADERPROC glCreateShader = NULL; 
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader"); 

如果定義GL_GLEXT_PROTOTYPES包括glext.h可以省略第一行之前。

編輯: SDL_opengl.h看起來像它包含glext.h副本(但不是最新的)。所以如果你使用上面的應該仍然有效。如果你想使用單獨的glext.h,你必須在包含SDL_opengl.h之前定義NO_SDL_GLEXT。而且,只要沒有定義GL_GLEXT_PROTOTYPES或者您自己編寫函數原型,函數原型就不可用。

EDIT2:顯然SDL有一個名爲SDL_GL_GetProcAddress自己的GetProcAddress函數。

0

你可以在運行時加載函數的地址嗎?

typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType); 
PFNGLCREATESHADERPROC glCreateShader = NULL; 
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"); 

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC)(); 
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL; 
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");