# GLUT

GLUT Mecanismos (del inglés OpenGL Utility Toolkit) es una biblioteca de utilidades para programas OpenGL que principalmente proporciona diversas funciones de entrada/salida con el sistema operativo. Entre las funciones que ofrece se incluyen declaración y manejo de ventanas y la interacción por medio de teclado y ratón. También posee rutinas para el dibujado de diversas primitivas geométricas (tanto sólidas como en modo wireframe) que incluyen cubos, esferas y teteras. También tiene soporte para creación de menús emergentes.
La versión original de GLUT fue escrita por Mark J. Kilgard, autor de OpenGL Programming for the X Window System y The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics, mientras trabajaba para Silicon Graphics.
Los dos objetivos de GLUT son para permitir la creación de código más portable entre diferentes sistemas operativos (GLUT es multiplataforma) y hacer OpenGL más simple. Introducirse en la programación con OpenGL utilizando GLUT conlleva normalmente sólo unas pocas líneas de código y hace innecesario el conocimiento de las API específicas de cada sistema operativo.
Todas las funciones de GLUT comienzan con el prefijo glut (por ejemplo, glutPostRedisplay indica que la ventana actual necesita ser redibujada).

## Implementaciones

La biblioteca GLUT original de Mark Kilgard soportaba X Window System (GLX) y fue portada a Microsoft Windows (WGL) por Nate Robins. Mac OS X trae su propio framework de GLUT que soporta su propia CGL.
El proyecto inicial de Kilgard ya no tiene mantenimiento y su licencia no libre no permitía la redistribución de versiones modificadas de la biblioteca. Este hecho hizo surgir implementaciones libres de la API desde cero. La primera fue freeglut, que pretende ser un clon bastante exacto, aunque con un pequeño número de funciones nuevas para hacer frente a las limitaciones de GLUT. Existe un fork de freeglut llamado OpenGLUT, que añade algunas nuevas funcionalidades respecto de la API original.

## Limitaciones

Algunas decisiones de diseño del GLUT original hace difícil a los programadores realizar las tareas deseadas. Esto llevó a muchos a crear parches y las extensiones para GLUT que se alejan del canon. Algunas implementaciones libres también incluyen arreglos diversos.
Las limitaciones más destacables de la biblioteca GLUT original son:
* La biblioteca exige a los programadores que llamen a glutMainLoop, una función que nunca termina. Esto hace difícil que los programadores integren GLUT en aplicaciones o bibliotecas en las que deseen poder tener control sobre su propio ciclo de ejecución. Una forma habitual de solucionar esto es introducir una nueva función, que suele llamarse glutCheckLoop, que ejecute una sola iteración del ciclo de ejecución de GLUT. Otra solución bastante común es ejecutar GLUT por separado mediante hilos, aunque esto puede ser distinto dependiendo del sistema operativo y puede provocar problemas de sincronización. Por ejemplo la implementación de GLUT para Mac OS X obliga a que el glutMainLoop se ejecute necesariamente en el hilo principal.
* El hecho de que glutMainLoop nunca termine también significa que el programa no sale nunca del ciclo de ejecución. freeglut soluciona este problema introduciendo una nueva función: glutLeaveMainLoop.
* La biblioteca termina el proceso cuando se cierra la ventana, lo que en algunas aplicaciones puede no ser deseable. Por eso muchas implementaciones incluyen una función extra llamada glutWMCloseFunc.