2009-06-19 11 views
7

Stavo per ricostruire la mia libreria in Dev-C++, sotto Windows; tuttavia, la funzionalità shader che ho aggiunto nel frattempo non è supportata, il compilatore non è riuscito a trovare le funzioni correlate (:: glCreateShader(), :: glCreateProgram(), ecc.)Shaders OpenGL v2.0 con Dev-C++ e SDL?

Scavando in Internet e Dev-C++, ho trovato che l'implementazione di OpenGL (gl.h) è solo v1.1. Ho trovato recommendations per scaricare le ultime intestazioni da SGI. Ho trovato gl3.h, tuttavia, dopo un attento esame mi sono reso conto che gl.h non è comunque incluso nel mio progetto, e dovrei guardare SDL/SDL_opengl.h.

EDIT: SDL_opengl.h fa includono gl.h e dichiara prototipi delle funzioni in questione. Quindi la domanda è: perché ho dato degli errori in fase di compilazione piuttosto che degli errori di linker?

(Biblioteca collegamenti solo contro mingw32, libOpenGL32, libSDL, libSDL_Image e libSDL_Mixer, molto simile sotto OSX (tranne che per mingw32, naturalmente) in cui non ho avuto alcun problema.)

Come posso usare Shader di OpenGL v2.0 con Dev-C++ e SDL?

+0

Perché sulla Terra vuoi usare Dev-C++? Fatti un favore e usa un IDE che è stato aggiornato negli ultimi 4 anni. (e che non era buggato e privo di funzionalità anche quando * era * supportato) – jalf

+0

Perché hai scelto Dev-C++ invece di VC++ 2008 Express? –

+0

È un punto giusto e non posso dire di non averlo visto arrivare. Windows non sarebbe stata la mia piattaforma principale e detestavo la giocoleria dei manifesti e le 6 versioni dei runtime di MSVC.Inoltre stavo per sviluppare GP2X, e il suo devkit ufficiale è un Dev-C++ whacked-out, quindi ho pensato che fosse comodo ... Sì, non lo è. – zyndor

risposta

8

gl.h è solo per OpenGL 1.1 (e in alcuni casi fino a 1,3 a seconda di quale versione del file che si sta utilizzando e il sistema operativo). Per tutto il resto è inoltre necessario glext.h e probabilmente glxext.h (Linux/Unix) o wglext.h (Windows).

Tutte le funzioni delle versioni più recenti di OpenGL devono essere collegate in fase di esecuzione. Quindi per poterli utilizzare è necessario ottenere l'indirizzo di funzione corretto e assegnarlo a un puntatore di funzione. Il modo più semplice per farlo è utilizzare qualcosa come GLEW.

Il modo manuale sarebbe qualcosa di simile:

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

o per Linux:

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

Se si definisce GL_GLEXT_PROTOTYPES prima di includere glext.h è possibile omettere la prima linea.

MODIFICA: SDL_opengl.h sembra che contenga una copia di glext.h (non aggiornato però). Quindi se usi quello sopra dovrebbe essere ancora valido. Se si desidera utilizzare un file glext.h separato, è necessario definire NO_SDL_GLEXT prima di includere SDL_opengl.h. Inoltre, i prototipi di funzione non sono disponibili fintanto che GL_GLEXT_PROTOTYPES non è definito o li scrivi tu stesso.

EDIT2: Apparentemente SDL ha la propria funzione GetProcAddress chiamata SDL_GL_GetProcAddress.

+0

"Inoltre, i prototipi di funzione non sono disponibili fintanto che GL_GLEXT_PROTOTYPES non è definito o li scrivi tu stesso." <- QUELLO. Grazie! – zyndor

+0

+1 per la menzione di SDL_GL_GetProcAddress. – Caterpillar

0

È possibile caricare gli indirizzi delle funzioni in fase di esecuzione?

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

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