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?

Foi útil?

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");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top