Pregunta

Quiero utilizar las funciones expuestas en las extensiones OpenGL.Estoy en Windows, ¿cómo hago esto?

¿Fue útil?

Solución

Solución fácil:Usar brillaba.Ver cómo aquí.

Solución difícil:Si tienes un razón realmente fuerte no usar GLEW, aquí se explica cómo lograr lo mismo sin él:

Identifique la extensión OpenGL y las API de extensión que desea utilizar.Las extensiones OpenGL se enumeran en la Registro de extensión OpenGL.

Ejemplo:Deseo utilizar las capacidades del EXT_framebuffer_objeto extensión.Las API que deseo usar desde esta extensión son:

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

Compruebe si su tarjeta gráfica admite la extensión que desea utilizar.Si es así, entonces ¡tu trabajo casi estará terminado!Descargue e instale los controladores y SDK más recientes para su tarjeta gráfica.

Ejemplo:La tarjeta gráfica de mi PC es una NVIDIA 6600GT.Entonces visito el Especificaciones de la extensión NVIDIA OpenGL página web y descubre que EXT_framebuffer_objeto Se admite la extensión.Luego descargo la última SDK de NVIDIA OpenGL e instalarlo.

El fabricante de su tarjeta gráfica proporciona un glext.h archivo de encabezado (o un archivo de encabezado con un nombre similar) con todas las declaraciones necesarias para usar las extensiones OpenGL compatibles.(Tenga en cuenta que es posible que no todas las extensiones sean compatibles). Coloque este archivo de encabezado en algún lugar donde su compilador pueda recogerlo o incluya su directorio en la lista de directorios incluidos de su compilador.

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

Abierto glext.h, busque la API que desea utilizar y obtenga su correspondiente feo declaración.

Ejemplo:Busco las API de framebuffer anteriores y encuentro sus correspondientes declaraciones feas:

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

Todo esto significa que su archivo de encabezado tiene la declaración API en 2 formas.Una es una fea declaración de puntero de función similar a wgl.La otra es una declaración de función que parece sensata.

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

Ejemplo:

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

Aunque parezca feo, todo lo que estamos haciendo es declarar punteros de función del tipo correspondiente a la extensión API.

Inicialice estos punteros de función con las funciones que les corresponden.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 olvide comprobar los punteros de función para NULO.Si por casualidad wglGetProcAddress() No pude 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, hemos terminado!Ahora puede utilizar estos punteros de función como si las llamadas a función 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: Más allá de OpenGL 1.1 para Windows por Dave Astle: el artículo está un poco anticuado, pero tiene toda la información que necesita para comprender por qué existe esta patética situación en Windows y cómo solucionarla.

Otros consejos

Una 'razón muy importante' para no utilizar GLEW podría ser que la biblioteca no sea compatible con su compilador/IDE.P.ej:Constructor Borland C++.

En ese caso, es posible que desees reconstruir la biblioteca desde el código fuente.Si funciona, genial; de lo contrario, la carga manual de extensiones no es tan mala como parece.

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

Pero el uso de ambas bibliotecas me parece casi el mismo.(GLEW tiene un en eso() (aunque debe llamarse antes que nada). Por lo tanto, no necesita cambiar a menos que encuentre alguna extensión que no sea compatible con GLEE.

GL3W es un script de dominio público que crea una biblioteca que carga solo 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;después de eso, no requiere Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top