Bases de Animación en OpenGL

Este tutorial muestra las bases necesarias para crear animaciones simples en OpenGL, incluyendo los conceptos de doble buffer, la coordinación de frames por tiempo y pasos. Al igual que en los anteriores tutoriales se dará un ejemplo aplicativo, aunque en este caso está hecho en Visual C++ Express.

La Animación.

Cualquier forma de animación, bien sea esta al estilo antiguo de Disney (frames hechos a mano), cine, animaciones gif, videos de computadora y videojuegos utiliza una técnica que consiste en mostrar rápidamente, a entre 30 y 60 cuadros por segundo (fps) un conjunto de imágenes que varían de forma ligera, para crear la sensación de movimiento aprovechando una característica de la visión humana llamada persistencia de la visión.

En el caso particular de los videojuegos, los frames se hacen mezclando un conjunto de figuras bidimensionales (sprites) o haciendo complejos cálculos sobre la manera en que se vería una proyección bidimensional de una escena “abstracta” tridimensional (3d), o una mezcla de ambas, y realizando en cada caso un cálculo del pequeño movimiento que debe hacer cada objeto para dar una sensación fluida de animación.

EL BUFFER DOBLE

Se ha mencionado ya que para poder dar la sensación de movimiento es necesario mostrar cerca de 30 cuadros por segundo. El problema es que el computador no genera “instantáneamente” la imagen a partir de los sprites o la escena 3d, por lo que si se posee una sola área de dibujo en la memoria se verán molestos intervalos entre un frame y otro (mientras se hacen los cálculos y se realizan movimientos de memoria). Es en este sentido que la estrategia de múltiples buffers, dos en este caso funciona.


doblebuffers

La estrategia es bastante simple, se tienen 2 áreas de memoria, una es la que actualmente se muestra en pantalla (Front Buffer) y la otra es sobre la cual se realizan los cálculos (back buffer). Cuando la escena se termina de dibujar se intercambian los papeles entre los buffers, es decir, el Back se convierte en Front y visceversa. De esta manera el usuario no ve cuando se está renderizando sobre el buffer, solo ve el resultado final, con la ventaja adicional de que el proceso es bastante eficiente, ya que no se realizan copias entre áreas de memoria, al menos para mostrar los frames.

La parte teórica funciona de manera similar en diferentes entornos, bien sea DirectX, OpenGL o SDL. En el caso práctico de OpenGL, la especificación del API no incluye una garantía de que los dos buffers estén presentes (obviamente al menos el Front debe existir), por lo que las funciones para solicitar y manejar mas de un buffer dependen del entorno en el que se esté ejecutando la aplicación (Windows, Mac, Linux, etc). Microsoft provee una implementación propia del Doble Buffer para Windows y esta misma funcionalidad es ofrecida por Glut y similares para diferentes sistemas operativos de manera genérica.

Implementación Glut

Es bastante sencilla (ver tutorial Hola Mundo 3d en OpenGL), basta solicitar el modo Doble Buffer al inicializar la ventana y cada vez que se terminan de pasar los parámetros de dibujo a OpenGL y estos han sido ejecutados, pedir un cambio de Buffer así:

[cpp]
inicializarVentana()
{

glutInitDisplayMode(GLUT_DOUBLE| …)

}

render()
{
//comandos de dibujo
glutSwapBuffers();
}
[/cpp]

La función glutInitDisplayMode() se encarga de solicitar al sistema el modo requerido por el programador, en este caso Doble Buffer (GLUT_DOUBLE) y otros que se le suministren seguidos de “|” (GLUT_DOUBLE | GLUT_RGB por ejemplo). glutSwapBuffers() intercambia el Buffer actual sobre el que se está dibujando (Back) con el que se muestra en pantalla (Front).

Implementación Windows

La implementación del doble buffer es algo mas compleja (ver tutorial Hola Complicado Mundo OpenGL – Win32), pero básicamente está ligada al PIXELFORMATDESCRIPTOR – HDC con los cuales se solicita y al HDC, con el cual se intercambian los Buffers. El código luce así:

[cpp]

HDC hdc=NULL;

crearVentana()
{
//todo el código para crear la ventana
static PIXELFORMATDESCRIPTOR pfd=
{

,… |PFD_DOUBLEBUFFER | //tercer parámetro
,…
};
PixelFormat=ChoosePixelFormat(hdc,&pfd);
}
render()
{
//El código de render
SwapBuffers(hdc);
}
[/cpp]

Donde el pdf es la variable para inicializar el modo de pantalla y hdc es el hardware device context asociado a la ventana.

1 2

Compartir esta entrada

DiggReddit

3 Responses to Bases de Animación en OpenGL

  1. bueno este tutorial esta bastante bueno, para los que se inician en este programa es bueno saber el tipo de programacion que se utiliza para animaciones GL muy bueno!!! si quieren ayuda para usar este programa escribeme a lamentevirtual@hotmail.com ya que soy un total experto en el mismo……ok 8)

  2. no mames aqui no explicas nada acerca de la animacion estas hablando de pura teoria y pseudocodigos, postea algo bueno, ejemplos buenos con codigo fuente y todo imagenes, asi no aportas nada. que basura!!

  3. Todo este site es muy “pro Windows” para mi gusto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *