1 of 7

Programación en OpenGL

Introducción a GLUT

por Javi Agenjo

javi.agenjo@gmail.com

2 of 7

Qué es GLUT?

Para poder usar OpenGL necesitamos crear el contexto de OpenGL, es decir, inicializar la librería para que esté lista para usarse.

 

Existen diferentes librerías que nos ayudan no solo a crear el contexto sino a interactuar con los diferentes eventos que se pueden producir al utilizar OpenGL (como por ejemplo recibir eventos de teclado y ratón, cambiar el tamaño de la ventana, salir de la aplicación, etc).

Como OpenGL no tiene que encargarse de esas cosas pero suelen ser necesarias, existe una libreria tambien estandar llamada GLUT que se encarga de estas cosas, sin embargo normalmente se usan librerias de terceros como SDL ya que son más óptimas y tienen más opciones disponibles. Aun así, GLUT es una buena opción para comenzar.

Cualquier llamada que hacemos a OpenGL antes de crear el contexto no se procesará.

3 of 7

GLUT (1/3)

GLUT gestiona los eventos mediante callbacks, es decir, el programador define a qué funciones debe llamar GLUT cada vez que se produzca un evento (pulsado de tecla, movimiento de ratón,ventana que cambia de tamaño,...).

Una vez arrancada la aplicación el flujo de ejecución de la aplicación queda gestionado por GLUT y esta irá llamando a los diferentes callbacks cada vez que suceda un evento, los más importantes son:

 

  • glutDisplayFunc: hay que pintar un frame
  • glutKeyboardFunc: se ha pulsado una tecla
  • glutMouseFunc: se ha movido o pulsado el raton
  • glutReshapeFunc: se ha cambiado el tamaño de la ventana
  • glutIdleFunc: no tengo nada que hacer (se usa para animar la escena)

4 of 7

GLUT (2/3)

Para definir una función de callback creas la función usando el mismo número y tipo de parámetros que requiere dicho callback.

Por ejemplo, el callback de pintar frame (glutDisplayFunc) requiere una función que no reciba ningun parametro y no retorne nada, así que tiene que ser así:

void myrender( )

Si la estructura del callback no coincide con la que se espera dará un error al compilar.

Para conocer la estructura de cada callback comprobar la referencia de GLUT

5 of 7

GLUT (3/3)

El callback de display glutDisplayFunc se llama cada vez que el sistema considera que debe repintarse la pantalla, pero eso no es continuamente por lo que si queremos realizar animaciones tenemos que poner en glutIdleFunc también la misma función de rende, así cuando esté "idle" (no tenga nada que hacer) irá llamando a la funcion de display.

De esta manera la escena no deja de pintarse y podemos animar objetos.

Es importante no hacer ningún bucle infinito dentro de un callback, ya que si eso sucede se colgaría la aplicación.

6 of 7

Ejemplo de callback

Supongamos que queremos capturar cuando el usuario pulsa un botón del ratón. Miramos el callback en la referencia de glut y vemos qué parametros necesita:

void (*func)(int button, int state, int x, int y)

Una vez sabemos  los parámetros creamos nuestra función que recibirá los callbacks:

void onMouseClick(int button, int state, int x, int y)

{

     if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN )

          std::cout << "Has pulsado el boton izquierdo!" << std::endl;

}

Y ahora le indicamos a glut al iniciar la app (en el main) que tiene que llamarla cada vez que se pulse el raton:

glutMouseFunc( onMouseClick );

7 of 7

Referencias

Para más información recomiendo mirar los siguientes enlaces:

 

OpenGL Reference page:

http://www.cs.utk.edu/~vose/c-stuff/opengl/opengl.html

GLUT Reference page

http://www.opengl.org/resources/libraries/glut/spec3/spec3.html

Tutoriales de NEHE

http://nehe.gamedev.net/