2009-06-19 11 views
7

Właśnie miałem przebudować moją bibliotekę w Dev-C++, pod Windows; Jednak funkcja modułu cieniującego dodana w międzyczasie nie jest obsługiwana, kompilator nie może znaleźć powiązanych funkcji (:: glCreateShader(), :: glCreateProgram() itp.)Shadery OpenGL v2.0 z wersją Dev-C++ i SDL?

Kopanie w Internecie i W folderze Dev-C++ odkryłem, że implementacja OpenGL (gl.h) to tylko wersja 1.1. Znalazłem recommendations, aby pobrać najnowsze nagłówki z SGI. Znalazłem gl3.h, jednak po bliższej analizie zdałem sobie sprawę, że gl.h i tak nie jest zawarty w moim projekcie i powinienem patrzeć na SDL/SDL_opengl.h.

EDIT: SDL_opengl.h ma obejmują gl.h i deklaruje prototypy funkcji w pytaniu. Tak więc pytanie brzmi: dlaczego podaję błędy podczas kompilacji, a nie błędy linkera?

(My biblioteki łączy tylko przeciwko mingw32, libOpenGL32, libSDL, libSDL_Image i libSDL_Mixer, podobnie jak pod OSX (z wyjątkiem dla mingw32, oczywiście), gdzie nie ma żadnego problemu.)

Jak mogę używać Cieniowniki OpenGL v2.0 z Dev-C++ i SDL?

+0

Dlaczego, na Boga, chcesz używać Dev-C++? Zrób sobie przysługę i użyj IDE, który został zaktualizowany w ciągu ostatnich 4 lat. (i który nie był wadliwy i pozbawiony funkcji, nawet gdy * był * obsługiwany). – jalf

+0

Dlaczego wybrałeś Dev-C++ zamiast VC++ 2008 Express? –

+0

To jest punkt zwrotny i nie mogę powiedzieć, że nie widziałem, żeby to nadchodziło. Windows nie był moją podstawową platformą i nienawidziłem żonglerki manifestami i 6 smaków runtimes MSVC.Dodatkowo zamierzałem opracować GP2X, a jego oficjalnym devkitem jest udoskonalone Dev-C++, więc pomyślałem, że to jest przydatne ... Tak, nie jest. – zyndor

Odpowiedz

8

gl.h jest tylko dla OpenGL 1.1 (aw niektórych przypadkach nawet do 1,3 w zależności od wersji pliku, którego używasz i jaki system operacyjny). Do wszystkiego jeszcze potrzebujesz: glext.h i prawdopodobnie glxext.h (Linux/Unix) lub wglext.h (Windows).

Wszystkie funkcje z nowszych wersji OpenGL muszą być połączone w czasie wykonywania. Aby więc z nich skorzystać, musisz uzyskać właściwy adres funkcji i przypisać go do wskaźnika funkcji. Najprostszym sposobem na to jest użycie czegoś takiego jak GLEW.

Instrukcja sposobem byłoby coś takiego:

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

lub Linux:

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

Jeśli zdefiniujemy GL_GLEXT_PROTOTYPES przed tym glext.h można pominąć pierwszą linię.

EDIT: Wygląda na to, że SDL_opengl.h zawiera kopię glext.h (nieaktualną). Więc jeśli użyjesz tego, powyższe powinno być nadal ważne. Jeśli chcesz użyć osobnego glext.h, musisz zdefiniować NO_SDL_GLEXT przed włączeniem SDL_opengl.h. Prototypy funkcji nie są dostępne tak długo, jak GL_GLEXT_PROTOTYPES nie jest zdefiniowany lub sam je piszesz.

EDIT2: Najwyraźniej SDL ma własną funkcję GetProcAddress o nazwie SDL_GL_GetProcAddress.

+0

"Prototypy funkcji nie są dostępne tak długo, jak GL_GLEXT_PROTOTYPES nie jest zdefiniowany lub sam je piszesz." <- TO. Dziękuję Ci! – zyndor

+0

+1 za wzmiankę o SDL_GL_GetProcAddress. – Caterpillar

0

Czy można załadować adresy funkcji w czasie wykonywania?

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

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