2008-08-18 18 views

Respuesta

19

Solución fácil: Utilice GLEW. Vea cómo here.

solución duro: Si usted tiene un muy fuerte razón no utilizar GLEW, aquí es cómo lograr la misma sin él:

Identifica la extensión de OpenGL y las API de extensión que desea utilizar. Las extensiones de OpenGL se enumeran en el OpenGL Extension Registry.

Ejemplo: Deseo utilizar las capacidades de la extensión EXT_framebuffer_object. Las API que desee utilizar esta extensión son:

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

Compruebe si su tarjeta gráfica es compatible con la extensión que desea utilizar. Si lo hace, ¡entonces su trabajo está casi listo! Descargue e instale los últimos controladores y SDK para su tarjeta gráfica.

Ejemplo: La tarjeta gráfica en mi PC es una NVIDIA 6600 GT. Entonces, visito la página web NVIDIA OpenGL Extension Specifications y encuentro que la extensión EXT_framebuffer_object es compatible. Luego descargo la última NVIDIA OpenGL SDK y la instalo.

Su fabricante de la tarjeta gráfica proporciona un archivo glext.h cabecera (o un archivo de cabecera de nombre similar) con todas las declaraciones necesarias para utilizar las extensiones OpenGL compatibles. (Tenga en cuenta que no todas las extensiones pueden ser compatibles.) Coloque este archivo de encabezado en algún lugar donde el compilador pueda recogerlo o incluya su directorio en la lista de directorios de inclusión de su compilador.

Agregue una línea #include <glext.h> en su código para incluir el archivo de encabezado en su código.

abierto glext.h, encontrar la API que desea utilizar y agarrar su correspondiente fea de aspecto declaración.

Ejemplo: Yo busco las API framebuffer anteriores y encontrar sus correspondientes declaraciones de aspecto feo:

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

Todo esto significa es que el archivo de cabecera tiene la declaración de API en 2 formas. Uno es una declaración de puntero de función fea similar a wgl. La otra es una declaración de función de aspecto sano.

Para cada API de extensión que desee utilizar, agregue las declaraciones de código del nombre de la función como un tipo de la cadena de aspecto feo.

Ejemplo:

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

A pesar de que se ve mal, todo lo que hacemos es declarar punteros de función del tipo correspondiente a la API de extensión.

Inicialice estos punteros a funciones con sus funciones correctas. Estas funciones están expuestas por la biblioteca o el controlador. Necesitamos usar wglGetProcAddress() función para hacer esto.

Ejemplo:

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

No se olvide de comprobar los punteros de función para NULL. Si por casualidad wglGetProcAddress() no pudo encontrar la función de extensión, habría inicializado el puntero con NULL.

Ejemplo:

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

Eso es todo, ya está! Ahora puede utilizar estos punteros de funciones como si las llamadas a funciones existieran.

Ejemplo:

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

Referencia:Moving Beyond OpenGL 1.1 for Windows por Dave Astle - El artículo es un poco anticuado, pero tiene toda la información que necesita para entender por qué existe esta situación patética en Windows y cómo sortearlo

+0

He pasado todo el día intentando que OpenGL trabaje con GLEW pero sigo teniendo problemas ... Para que lo sepas: OpenGL no es tan fácil de configurar. Pero cuando se está ejecutando: P –

0

@Kronikarz: Por lo que parece, GLEW parece ser el camino del futuro. NVIDIA ya lo envía junto con su OpenGL SDK. Y su último lanzamiento fue en 2007 en comparación con GLEE, que fue en 2006.

Pero el uso de ambas bibliotecas es casi igual para mí. (GLEW tiene un init() que necesita ser llamado antes que cualquier otra cosa). Por lo tanto, no necesita cambiar a menos que encuentre alguna extensión que no sea compatible con GLEE.

+0

La última versión de GLEW es 1.9.0 desde 2012 06 de agosto. –

+0

La última versión de GLEW ahora es 1.12.0 desde el 26 de enero de 2015. Por lo tanto, es obviamente compatible de forma activa :) – iondune

3

Una "razón muy fuerte" para no usar GLEW podría ser que la biblioteca no es compatible con su compilador/IDE. Por ejemplo: Borland C++ Builder.

En ese caso, es posible que desee reconstruir la biblioteca desde el origen. Si funciona, genial, de lo contrario, la carga manual de la extensión no es tan mala como lo hace el sonido.

0

GL3W es una secuencia de comandos de dominio público que crea una biblioteca que solo carga la funcionalidad principal para OpenGL 3/4. Se puede encontrar en GitHub en:

https://github.com/skaslev/gl3w

GL3W requiere Python 2.6 para generar las bibliotecas y encabezados para OpenGL; no requiere Python después de eso.

Cuestiones relacionadas