Quiero usar las funciones expuestas en las extensiones OpenGL. Estoy en Windows, ¿cómo hago esto?Uso de extensiones OpenGL En Windows
Respuesta
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
@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.
La última versión de GLEW es 1.9.0 desde 2012 06 de agosto. –
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
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.
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.
- 1. Uso de GLEW para usar extensiones OpenGL bajo Windows
- 2. Instalación de extensiones de PHP en Windows
- 3. uso de rotación de glm en Opengl
- 4. Uso de OpenGL con Python
- 5. En Windows, ¿cómo difiere OpenGL de DirectX?
- 6. Implementación de aplicaciones OpenGL en Windows Mobile
- 7. Tutorial para las extensiones shell de Windows
- 8. Uso de OpenGL Toon Shader en GLSL
- 9. framebuffer y uso de sombreadores en opengl
- 10. Incluir OpenGL Bibliotecas en C++, Windows 7
- 11. Uso de extensiones de matraz en planos de matraz
- 12. Creando extensiones C de Python de 64 bits en Windows
- 13. Instalación de extensiones de Ruby nativas en Windows para Jekyll
- 14. Introducción a OpenGL ES 2.0 en Windows
- 15. Seleccione un dispositivo gráfico en Windows + OpenGL
- 16. ¿Debería Direct3D usarse sobre OpenGL en Windows?
- 17. En Windows, WebGL hace uso de DirectX Runtime u OpenGL runtime?
- 18. Ocultar extensiones en Vista/Windows 7 WPF FileDialog.Filter
- 19. Uso de extensiones reactivas en el "mundo real"
- 20. Las extensiones Mercurial no funcionan en Windows 7 x64?
- 21. Uso de OpenGL para reemplazar Canvas - Android
- 22. Uso de recursos en Windows
- 23. gluUnProject Android OpenGL ES 1.1 Uso
- 24. ¿Cómo uso las extensiones de Git y Git?
- 25. Uso de cmake en Windows para C++
- 26. ¿Qué son las extensiones OpenGL, y cuáles son los beneficios/compensaciones de usarlas?
- 27. Qué idiomas escribir extensiones de shell de Windows
- 28. Uso de los modelos de Blender/SketchUp en OpenGL
- 29. Uso de las funciones de OpenGL ES en un Mac
- 30. Uso de las extensiones de Liquibase con Maven
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 –