Pergunta

Quero usar as funções expostas nas extensões OpenGL.Estou no Windows, como faço isso?

Foi útil?

Solução

Solução fácil:Usar GLEW.Veja como aqui.

Solução difícil:Se você tem um razão muito forte para não usar o GLEW, veja como conseguir o mesmo sem ele:

Identifique a extensão OpenGL e as APIs de extensão que você deseja usar.As extensões OpenGL estão listadas no Registro de extensão OpenGL.

Exemplo:Desejo usar os recursos do EXT_framebuffer_object extensão.As APIs que desejo usar nesta extensão são:

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

Verifique se a sua placa gráfica suporta a extensão que você deseja usar.Se isso acontecer, então seu trabalho está quase concluído!Baixe e instale os drivers e SDKs mais recentes para sua placa gráfica.

Exemplo:A placa gráfica do meu PC é uma NVIDIA 6600GT.Então, eu visito o Especificações da extensão NVIDIA OpenGL página da web e descobrir que o EXT_framebuffer_object extensão é suportada.Eu então baixo o mais recente SDK OpenGL da NVIDIA e instale-o.

O fabricante da sua placa gráfica fornece um glext.h arquivo de cabeçalho (ou um arquivo de cabeçalho com nome semelhante) com todas as declarações necessárias para usar as extensões OpenGL suportadas.(Observe que nem todas as extensões podem ser suportadas.) Coloque esse arquivo de cabeçalho em algum lugar que seu compilador possa buscá-lo ou inclua seu diretório na lista de diretórios de inclusão do seu compilador.

Adicione um #include <glext.h> linha em seu código para incluir o arquivo de cabeçalho em seu código.

Abrir glext.h, encontre a API que deseja usar e pegue seu correspondente feio declaração.

Exemplo:Procuro as APIs de framebuffer acima e encontro suas declarações feias correspondentes:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

Tudo isso significa que seu arquivo de cabeçalho possui a declaração da API em 2 formas.Uma delas é uma declaração de ponteiro de função feia, semelhante a wgl.A outra é uma declaração de função de aparência sensata.

Para cada API de extensão que você deseja usar, adicione em seu código declarações do nome da função como um tipo de string de aparência feia.

Exemplo:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

Embora pareça feio, tudo o que estamos fazendo é declarar ponteiros de função do tipo correspondente à API de extensão.

Inicialize esses ponteiros de função com suas funções corretas.Essas funções são expostas pela biblioteca ou driver.Precisamos usar wglGetProcAddress() função para fazer isso.

Exemplo:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

Não se esqueça de verificar os ponteiros de função para NULO.Se por acaso wglGetProcAddress() não conseguisse encontrar a função de extensão, o ponteiro teria inicializado com NULL.

Exemplo:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
    // Extension functions not loaded!
    exit(1);
}

É isso, terminamos!Agora você pode usar esses ponteiros de função como se as chamadas de função existissem.

Exemplo:

glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

Referência: Indo além do OpenGL 1.1 para Windows por Dave Astle - O artigo é um pouco desatualizado, mas contém todas as informações que você precisa para entender por que essa situação patética existe no Windows e como contorná-la.

Outras dicas

Um 'motivo muito forte' para não usar o GLEW pode ser que a biblioteca não é suportada pelo seu compilador/IDE.Por exemplo:Construtor Borland C++.

Nesse caso, você pode querer reconstruir a biblioteca a partir do código-fonte.Se funcionar, ótimo, caso contrário, o carregamento manual da extensão não é tão ruim quanto parece.

@Kronikarz:Pelo que parece, GLEW parece ser o caminho do futuro.A NVIDIA já o envia junto com seu SDK OpenGL.E seu último lançamento foi em 2007, em comparação com GLEE, que foi em 2006.

Mas o uso de ambas as bibliotecas parece quase o mesmo para mim.(GLEW tem um iniciar() que precisa ser chamado antes de qualquer outra coisa.) Portanto, você não precisa mudar, a menos que encontre alguma extensão que não seja suportada pelo GLEE.

GL3W é um script de domínio público que cria uma biblioteca que carrega apenas funcionalidades básicas do OpenGL 3/4.Ele pode ser encontrado no github em:

https://github.com/skaslev/gl3w

GL3W requer Python 2.6 para gerar bibliotecas e cabeçalhos para OpenGL;não requer Python depois disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top