Domanda

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.)

Scavando su Internet e nella cartella Dev-C ++, ho scoperto che l'implementazione OpenGL (gl.h) è solo v1.1. Ho trovato consigli 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 include include gl.h e dichiara i prototipi delle funzioni in questione. Quindi la domanda è: perché ho dato errori di compilazione anziché errori di linker?

(La mia libreria si collega solo a mingw32, libOpenGL32, libSDL, libSDL_Image e libSDL_Mixer, un po 'come in OSX (tranne ovviamente per mingw32) dove non ho avuto problemi.)

Come posso usare gli shader OpenGL v2.0 con Dev-C ++ e SDL?

È stato utile?

Soluzione

gl.h è solo per OpenGL 1.1 (e in alcuni casi fino alla 1.3 a seconda della versione del file che stai utilizzando e del sistema operativo). Per tutto il resto hai bisogno anche di 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 usarli è necessario ottenere l'indirizzo della funzione corretta e assegnarlo a un puntatore a funzione. Il modo più semplice per farlo è utilizzare qualcosa come GLEW .

Il modo manuale sarebbe qualcosa del genere:

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

o per Linux:

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

Se definisci GL_GLEXT_PROTOTYPES prima di includere glext.h puoi omettere la prima riga.

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

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

Altri suggerimenti

È 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");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top