OpenGL y Bloodshed
Mientras (re)aprendo OpenGL iré contando los escollos que me encuentre en el camino y cómo los he solucionado. Mi primer problema ha sido escoger el entorno de programación y echar a correr mi primer ejemplo. Últimamente he estado programando con el Bloodshed para C++, así que para no cambiar de entorno de primeras quería usar ese. No sé porqué no he conseguido echar a andar ningún programa con la GLUT, me da siempre problemas al linkar. Así que después de varios intentos me decidí por la
Pero antes de seguir, detengámonos un poco para ecplicar que es todo estos nombres que puden sonar a nuevos:
¿Qué es OpenGL? Es una API (Application Programming Interface) para gráficos 2D y 3D multiplataforma. Lo que quiere decir que es un conjunto de librerías que nos permiten plasmar en pantalla gráficos 2D y 3D.
¿Qué es la GLUT (GL Utility Toolkit)? Es un conjunto de funciones que facilitan la entrada y salida de datos con OpenGL. Esta librería permite crear ventanas, gestionarlas, recoger la entrada de teclado y del ratón, dibujar primitivas más complejas que las de OpenGL y unas cuantas cosas más.
¿Qué es la windows.h? Pues aun no sé mucho de ella. Solo que es una librería que me permite poner ventanas de windows y gestionar la entrada salida de una forma mucho menos cómoda e intuitiva que la GLUT, pero por ahora es la que puedo usar (Si a alguien que lea esto le funciona l aGLUT en el Blooshed que me avise, aunque de todas formas pronto provaré con Eclipse y ya os contaré.)
Bien, ya que sabéis de que va el tema os contaré el par de cosillas que hay que hacer para poder trabajar con OpenGL en Bloodshed y poder centrarnos en aprenderlo sin preocuparnos de mucho más :)
Los dos ejemplos mencionados nos servirán para lo que acabo de proponer. Aunque personalmente prefiero el Framework del wiki de OpenGL. Aunque tampoco hace alarde de una gran modularización sí que es cierto que nos separa el código que nos interesa del que no tanto en dos archivos, con lo que si no quremos no tenemos que mirar siquiera cómo va eso de la ventanita con windows.h.
En el ejemplo del Bloodshed solo tendremos que poner el código OpenGL que queramos probar justo a continuacón del comentario que dice algo así como “/* OpenGL animation code goes here */” Algo que resulta trivial en cuanto sabemos 2 palabras de inglés.
En mi preferido solo tendremos que copiar el codigo que aparece en la página en los dos archivos que indica (Framework.h y OpenGLBase.cpp) para Windows. Luego nos vamos abajo del todo y copiamos el tercer archivo, el render.cpp. Creamos estos archivos en un proyecto de Blooshed, los guardamos y casi estará todo hecho. Solo nos queda añadirle un par de parámetros al linker para que utilice la biblioteca OpenGL. Pinchamos en “Proyecto/Opciones de Proyecto”. Luego, dentro de la ventana que nos aparece, en la pestaña de “Parámetros” y en el área de texto de linker escribimos: “-lopengl32″ y “-lglu32″ separados por un intro. Y yá está.
Una vez hecho ésto deberíamos poder darle a compilar y ejecutar sin problemas el programita. Nos aparecerá el típico triángulo con la gama de colores girando sobre su centro.
Para escribir nuevo código solo tendremos que irnos al archivo “render.cpp” y sustituir el código del triángulo por el que queramos. En los siguientes tutoriales del wiki siempre nos dan el render.cpp correspondiente, con lo que vamos viendo los fundamentos de OpenGL en funcionamiento sin problemas.
Para entender mejor algunas de las funciones de OpenGl también disponemos de los Tutores de Nate Robins en los que podremos modificar los parámetros de las funciones y ver en tiempo real el efecto que producen nuestros cambios. Para empezar no está nada mal. La verdad es que cuando di la asignatura de Gráficos en la carrera no me enterá de la mitad porque el profesor era malísimo, pero al menos me sentó algo de base, (minúscula y sobre todo matemática) y de interés por el tema. Con estos tutoriales podemos hacer algo, pero no creáis que con eso ya se sabe OpenGL, hay mucho que aprender y lo mejor sería organizarlo un poco más modular de como se nos presenta en la web.
Antes de empezar hay que tener en cuenta una cosa muy importante sobre el funcionamiento de OpenGL:
OpenGL es una máquina de estados. ¿Y qué quiere decir eso? Pues que el orden en que escribimos las instrucciones es crucial. Si por ejemplo queremos pintar un triángulo de un color determinado tendremos que establecer el color y luego pintar el triángulo, pero no solo eso. Todo lo que pintemos a partir de la orden de cambiar el color (glColor) se pintará en ese color. Y así con todo. Por ejemplo:
glColor3f (1.0f, 0.0f, 0.0f);
glBegin (GL_TRIANGLES);
glVertex2f (0.0f, 1.0f);
glVertex2f (0.87f, -0.5f);
glVertex2f (-0.87f, -0.5f);
glEnd ();
glColor3f (0.0f, 1.0f, 0.0f);
glBegin (GL_TRIANGLES);
glVertex2f (0.0f, 1.0f);
glVertex2f (0.87f, -0.5f);
glVertex2f (-0.87f, -0.5f);
glEnd ();
glBegin (GL_TRIANGLES);
glVertex2f (0.0f, 1.0f);
glVertex2f (0.87f, -0.5f);
glVertex2f (-0.87f, -0.5f);
glEnd ();
Con estas órdenes escribimos tres triángulos (estarían superpuestos porque he hecho un copy-paste, ese no es el tema) Puede parecer que al tercero le falta el color, o que se pintará de rojo, porque el verde solo afecta al triángulo del medio, pero pintaremos el primero de rojo y los otros dos verdes ya que el último se pinta del ultimo color establecido con la orden glColor3f. Cada vez que ponemos esta orden todo lo qu evaya detrás y hasta la siguiente se pintará de ese color. Esto ocurre con todas las funciones de OpenGl (glRotate, glTranslate, glEnable….) ya que es la filosofía de programación que utiliza.
Otra cosa importante para entender de forma más cómoda las funciones de OpenGL es que siguen un patron para el nombre. Todas las funciones de OpenGL comienzan con “gl”, las de la GLU con “glu” y las de la GLUT con “glut”, a continuación un nombre descriptivo de la operación que realiza y luego un número y una letra que indican el número de parámetros de la función y su tipo. Por ejemplo:
glColor3f - es una función de OpenGL que sirve para cambiar el estado Color y que recibe tres número reales (float).
Así de sencillo, es una buena regla nemotécnica que nos ayudará mucho a la hora de trabajar con todas estas funciones nuevas.
Bueno, por ahora creo que es bastante para empezar, meterle mano a los tutoriales del wiki y aprender a manejarse un poquito. Personalmente espero tener pronto hecho el tutorial entero e ir avanzando, ya os contaré si me encuentro más problemas o si lo supero sin problemas vendré a contar cual es mi siguiente paso.
bams




