Pregunta

Estaba a punto de reconstruir mi biblioteca en Dev-C ++, bajo Windows; sin embargo, la funcionalidad de sombreador que agregué mientras tanto no es compatible, el compilador no pudo encontrar las funciones relacionadas (:: glCreateShader (), :: glCreateProgram (), etc.)

Excavando en Internet y la carpeta Dev-C ++, descubrí que la implementación de OpenGL (gl.h) es solo v1.1. Encontré recomendaciones para descargar los últimos encabezados de SGI . Sin embargo, he encontrado gl3.h, 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.

EDITAR: SDL_opengl.h incluye gl.h y declara prototipos de las funciones en cuestión. Entonces la pregunta es, ¿por qué he dado errores en tiempo de compilación en lugar de errores de enlace?

(Mi biblioteca solo enlaza con mingw32, libOpenGL32, libSDL, libSDL_Image y libSDL_Mixer, al igual que en OSX (excepto mingw32, por supuesto) donde no tuve ningún problema).

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

¿Fue útil?

Solución

gl.h es solo 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 recientes de OpenGL deben estar vinculadas en tiempo de ejecución. Entonces, 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 hacer esto es usar algo como GLEW .

La forma manual sería algo así:

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, puede omitir la primera línea.

EDITAR: 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 utilizar un glext.h separado, debe definir NO_SDL_GLEXT antes de incluir SDL_opengl.h. Además, los prototipos de funciones no están disponibles mientras GL_GLEXT_PROTOTYPES no esté definido o los escriba usted mismo.

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

Otros consejos

¿Puede 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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top