29JulOpenGL y GLUT en Xcode

En primer lugar, quiero decir que este post es bastante específico y, posiblemente, sólo será útil para aquellos programadores que deseen realizar alguna aplicación con la librería gráfica OpenGL desde el IDE Xcode de MacOS. En este breve tutorial pretendo indicaros los pasos necesarios para crear un proyecto en C++ haciendo uso de las librerías de OpenGL y GLUT que incorpora el sistema operativo de Apple.

En primer lugar debemos arrancar el entorno de desarrollo Xcode, por ejemplo desde la carpeta de Aplicaciones, y nos disponemos a crear un nuevo proyecto vacío haciendo clic en File/New Project y posteriormente, en la ventana emergente, Empty Project.

Creamos un nuevo proyecto en Xcode.

Creamos un nuevo proyecto en Xcode.

Creamos un nuevo proyecto vacío.

Seleccionamos proyecto vacío.

Luego debemos indicar un nombre para el proyecto. Para el ejemplo utilizaremos el nombre de “SegmentationFault”.

Damos nombre al proyecto.

Damos nombre al proyecto.

Y ya tenemos el proyecto vacío creado. Ahora debemos empezar a configurarlo para que funcione con OpenGL y GLUT. Primero crearemos un nuevo Target, mediante Project/New Target o con el botón derecho encima de Targets y Add/New Target.

Añadimos un nuevo Target al proyecto.

Añadimos un nuevo Target al proyecto.

Seleccionamos el tipo del Target como Cocoa Application y especificamos un nombre, por ejemplo, GLUT.

Seleccionamos Cocoa App como tipo de Target.

Seleccionamos Cocoa App como tipo de Target.

Especificamos un nombre para el Target.

Especificamos un nombre para el Target.

A continuación se nos muestran las configuraciones por defecto del Target, de las cuales sólo deberemos modificar la entrada de GCC_PREFIX_HEADER para poner el campo en blanco. Recomiendo que utilicéis el buscador para encontrar la opción entre todas las existentes.

Configuración por defecto del nuevo Target.

Configuración por defecto del nuevo Target.

Búsqueda de la entrada GCC_PREFIX_HEADER.

Búsqueda de la entrada GCC_PREFIX_HEADER.

Eliminamos la información del campo Value.

Eliminamos la información del campo Value.

Ahora debemos añadir a nuestro Target, los Frameworks de OpenGL y GLUT incluidos en la libraría del Sistema Operativo. Para ello clic derecho sobre el Target creado y seleccionamos Add/Existing Frameworks…

Añadimos los Frameworks de OpenGL y GLUT.

Añadimos los Frameworks de OpenGL y GLUT.

Nos aparecerá una ventana en la que deberemos seleccionar los Frameworks GLUT.framework y OpenGL.framework alojados en la carpeta /Sistema/Librería/Frameworks de nuestro disco duro. Podemos seleccionar ambos manteniendo pulsada la tecla cmd mientras clicamos.

Seleccionamos los frameworks GLUT y OpenGL de /System/Lybrary/Framewoks.

Seleccionamos los frameworks GLUT y OpenGL de /System/Library/Framewoks.

En la ventana emergente que aparece después de seleccionarlos no modificamos nada y simplemente clicamos sobre Add.

Continuamos el proceso con las opciones por defecto pulsando Add.

Continuamos el proceso con las opciones por defecto pulsando Add.

Ahora ya tenemos configurado nuestro proyecto para que trabaje con las librerías OpenGL y GLUT. A continuación creamos un nuevo fichero de código fuente al proyecto para comprovar que todo funciona correctamente.

Añadimos nuevo fichero de código fuente.

Añadimos nuevo fichero de código fuente.

Seleccionamos nuevo fichero vacío en el proyecto y especificamos un nombre, por ejemplo, main.cpp.

Seleccionamos nuevo fichero vacío.

Seleccionamos nuevo fichero vacío.

Especificamos un nombre, p.e. main.cpp.

Especificamos un nombre, p.e. main.cpp.

En el nuevo fichero podemos poner el código que os muestro a continuación que, si todo el proceso ha ido correctamente, debe renderizar un triángulo en pantalla.

//include GLUT
#include <GLUT/glut.h>;

//set the macros for the window size
#define SIZEX 500
#define SIZEY 500

//initializing stuff
void init(void)
{
   glDisable( GL_DEPTH_TEST ); //triangles have two sides
   glDisable( GL_CULL_FACE ); //triangles have two sides
}

//Render one frame
void render(void)
{
   //Clear the window and the depth buffer
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   //Render the triangle
   glBegin(GL_TRIANGLES);
   glColor3f(1.0f, 0.0f, 0.0f ); //change vertex color
   glVertex2d( -0.5f, -0.5f );

   glColor3f(0.0f, 1.0f, 0.0f ); //change vertex color
   glVertex2d( 0.5f, -0.5f );

   glColor3f(0.0f, 0.0f, 1.0f ); //change vertex color
   glVertex2d( 0.0f, 0.5f );
   glEnd();

   //Swap front and back buffer
   glutSwapBuffers();
}

int main(int argc, char **argv)
{
   //init all OpenGL stuff
   glutInit(&amp;argc, argv); //init GLUT
   glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ); //init framebuffer properties
   glutInitWindowSize(SIZEX, SIZEY); //init window dimensions
   glutCreateWindow("Segmentation Fault");	//create window

   //now that we have the window we can set the opengl state
   init();

   //set the callbacks
   glutDisplayFunc(render);  //render a frame
   glutIdleFunc(render);	     //what to do when nothing happens

   //start the GLUT mainloop (this function will be executed in a loop)
   glutMainLoop();

   return 0;
}

Y el resultado debe ser este:

Triángulo resultante del código del ejemplo.

Triángulo resultante del código del ejemplo.

Como siempre os digo, ante cualquier duda sabed que no cobramos por comentar. Salu2! ;)

Fuentes

OneSadCookie – http://blog.onesadcookie.com/2007/12/xcodeglut-tutorial.html

Javi Agenjo – http://www.tecn.upf.edu/~jagenjo/

11 Responses and Counting...

  • Bitacoras.com

    July 29th 2009

    Información Bitacoras.com…

    Valora en Bitacoras.com: No hay resumen disponible para esta anotación…

  • Bracelets

    Thank you very much for that glorious article

  • Floost

    I really like your blog and i respect your work. I’ll be a frequent visitor.

  • babafisa

    Great article . Will definitely copy it to my website.

  • hotspotshield

    It was a very interesting post thanks for writing it!

  • John

    Are you a professional journalist? You write very well.

  • Kouba

    Valuable thoughts and advices. I read your topic with great interest.

  • Kouba

    I read a few topics. I respect your work and added blog to favorites.

  • Kouba

    In truth, immediately i didn’t understand the essence. But after re-reading all at once became clear.

  • zambombas

    Hola!! perdona queria comentarte que me da un pequeño error aqui en
    glutInit(&amp,argc,argv);
    diciendome que la variable no esta creada ( que es verdad ) , pero en tu codigo no la veo por ningun lado :)

  • Gabi García

    Hola zambombas!

    Pues el error está en mi código. Más que un error, es una pequeña errata generada por el editor de WordPress que ha transformado el caracter & en su correspondiente valor en entity HTML. Sólo debes modificar la línea que te da error:

    glutInit(&amp,argc,argv);

    Por su versión correcta:

    glutInit(&argc,argv);

    En esta línea llamas a la función glutInit() pasándole por parámetros los argumentos de la función main por referencia.

    Gracias por tu aportación y espero que se solucione el problema.

    Salu2!