Sombreadores v2.0 OpenGL com Dev-C ++ e SDL?
Pergunta
Eu estava prestes a reconstruir a minha biblioteca em Dev-C ++, no Windows; no entanto, a funcionalidade shader eu adicionei enquanto isso não é suportado, o compilador não conseguia encontrar as funções relacionadas (:: glCreateShader (), :: glCreateProgram (), etc.)
Indo ao redor da Internet e pasta do Dev-C ++, eu descobri que a implementação OpenGL (gl.h) é de apenas v1.1. Eu encontrei recomendações para baixar as últimas cabeçalhos de SGI . Eu descobri gl3.h, no entanto, após um exame mais minucioso eu percebi que gl.h não está incluído no meu projeto de qualquer maneira, e eu deveria estar olhando para SDL / SDL_opengl.h.
EDIT: SDL_opengl.h faz incluem gl.h e declara protótipos das funções em causa. Então a questão é, por que ame I dada erros em tempo de compilação em vez de erros de vinculador?
(Minhas únicas ligações biblioteca contra mingw32, libOpenGL32, libSDL, libSDL_Image e libSDL_Mixer, muito parecido sob OSX (exceto para mingw32, é claro), onde eu não tive qualquer problema.)
Como posso usar shaders v2.0 OpenGL com Dev-C ++ e SDL?
Solução
gl.h é apenas para OpenGL 1.1 (e em alguns casos até 1,3 dependendo de qual versão do arquivo que você está usando e qual sistema operacional). Para tudo o resto que você também precisa glext.h e, provavelmente, glxext.h (Linux / Unix) ou wglext.h (Windows).
Todas as funções das versões mais recentes do OpenGL deve ser vinculado em tempo de execução. Portanto, a fim de usá-los você deve obter o endereço de função direita e atribuí-la a um ponteiro de função. A maneira mais fácil de fazer isso é usando algo como GLEW .
A forma manual seria algo como isto:
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");
ou para Linux:
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader");
Se você definir GL_GLEXT_PROTOTYPES antes de incluir glext.h você pode omitir a primeira linha.
EDIT: SDL_opengl.h parece que contém uma cópia do glext.h (não até à data embora). Então, se você usar que o acima deve ainda ser válido. Se você quiser usar um glext.h separado você deve definir NO_SDL_GLEXT antes de incluir SDL_opengl.h. Além disso, os protótipos de funções não estão disponíveis enquanto GL_GLEXT_PROTOTYPES não está definida ou você escrevê-los sozinho.
EDIT2: Aparentemente SDL tem sua própria função GetProcAddress chamado SDL_GL_GetProcAddress .
Outras dicas
Você pode carregar os endereços das funções em tempo de execução?
typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType);
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");