2009-06-19 10 views
7

Estaba a punto de reconstruir mi biblioteca en Dev-C++, bajo Windows; sin embargo, la funcionalidad de sombreado que he agregado mientras tanto no es compatible, el compilador no pudo encontrar las funciones relacionadas (:: glCreateShader(), :: glCreateProgram(), etc.)Shaders de OpenGL v2.0 con Dev-C++ y SDL?

Excavando en Internet y Carpeta Dev-C++, descubrí que la implementación de OpenGL (gl.h) es solo v1.1. He encontrado recommendations para descargar los últimos encabezados de SGI. He encontrado gl3.h, sin embargo, después de un examen más detallado me he dado cuenta de que gl.h no está incluido en mi proyecto de todos modos, y debería estar mirando SDL/SDL_opengl.h.

EDIT: SDL_opengl.h qué incluyen gl.h y declara prototipos de las funciones en cuestión. Entonces la pregunta es, ¿por qué me dieron errores de tiempo de compilación en lugar de errores de enlazador?

(Mi biblioteca sólo enlaza contra mingw32, libOpenGL32, libSDL, libSDL_Image y libSDL_Mixer, al igual que en OSX (a excepción de mingw32, por supuesto) en la que yo no tenía ningún problema.)

¿Cómo puedo usar ¿Los sombreadores de OpenGL v2.0 con Dev-C++ y SDL?

+0

¿Por qué demonios quieres usar Dev-C++? Hágase un favor y use un IDE que se haya actualizado en los últimos 4 años. (y que no tenía errores y carecía de características incluso cuando * era * compatible) – jalf

+0

¿Por qué ha elegido Dev-C++ en lugar de VC++ 2008 Express? –

+0

Es un punto justo y no puedo decir que no lo vi venir. Windows no iba a ser mi plataforma principal y aborrecía los malabares de los manifiestos y los 6 sabores de los tiempos de ejecución de MSVC.Además, me iba a desarrollar para GP2X, y su devkit oficial es un devastado Dev-C++, así que pensé que era útil ... Sí, no lo es. – zyndor

Respuesta

8

gl.h es sólo para OpenGL 1.1 (y en algunos casos hasta 1,3 dependiendo de la versión del archivo que está utilizando y qué sistema operativo). Para todo lo demás, también necesita glext.h y probablemente glxext.h (Linux/Unix) o wglext.h (Windows).

Todas las funciones de las versiones más nuevas de OpenGL se deben vincular en el tiempo de ejecución. Por lo tanto, para usarlos debe obtener la dirección de función correcta y asignarla a un puntero de función. La forma más fácil de hacerlo es usando algo como GLEW.

La forma manual sería algo como esto:

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

o para Linux:

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

Si define GL_GLEXT_PROTOTYPES antes de incluir glext.h se puede omitir la primera línea.

EDIT: SDL_opengl.h parece que contiene una copia de glext.h (aunque no está actualizado). Entonces, si usa eso, lo anterior aún debería ser válido. Si desea usar un glext.h separado, debe definir NO_SDL_GLEXT antes de incluir SDL_opengl.h. Además, los prototipos de función no están disponibles siempre que GL_GLEXT_PROTOTYPES no esté definido o usted mismo los escriba.

EDIT2: Aparentemente SDL tiene su propia función GetProcAddress llamada SDL_GL_GetProcAddress.

+0

"Además, los prototipos de función no están disponibles siempre que GL_GLEXT_PROTOTYPES no esté definido o usted mismo los escriba". <- ESO. ¡Gracias! – zyndor

+0

+1 para la mención de SDL_GL_GetProcAddress. – Caterpillar

0

¿Se pueden cargar las direcciones de las funciones en tiempo de ejecución?

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

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