miércoles, 26 de marzo de 2014

One Game a Month

Casi un año sin escribir nada en mi blog, he estado muy ocupado, pero quería empezar de nuevo, esta vez hablando de proyectos personales.

One Game a Month es una especie de "campo de entrenamiento" en el que mensualmente los participantes deben entregar un juego de video, no es obligatorio, pero el sistema de puntuación te motiva a hacerlo. No importa la complejidad del juego, sólo importa que lo hagas.

Entré a finales de enero y empece con un juego tipo asteroids, no pude terminarlo (pero esta pendiente) y de inmediato empece otro, Flappy Chubby Cupid! el cual pude culminar satisfactoriamente, fue cuando me di cuenta que si podía terminar lo que empezaba.

El arte del juego fue trabajo de un amigo, Juan Coste (el hermano del famoso diver Carlos Coste) quien es un excelente (el mejor que conozco) ilustrador y artista conceptual de videojuegos.

Pero, ¿qué me motivó a terminarlo en tiempo récord? Dos cosas, la primera, era el juego con el que participaría en el flappy jam, y la segunda, el tema era perfecto para San Valentín y logré publicarlo un día antes!

Al mes empezó el cyberpunkjam, intenté hacer algo diferente, así que fui por un puzzler, ya que relacioné el tema con algo de "hacking" me imagine hacer un rompecabezas que simule que hackers una terminal, pero lo mejor que pude hacer fue un "connecting pipes" puzzler donde se supone traspasas archivos del computador a tu memoria (los robas). El resultado: sudo Hack tiene sólo 10 niveles, pero planeo hacer más o incluso un generador. El arte fue proporcionado por un amigo llamado David Bisbal (no, no es el cantante) quien me ayudó a tener una portada decente y elementos del juego llamativos.

No pasó una semana y me enteré del bacongamejam! Para el cual hice el juego Makin' Bacon Pancakes (enlace del concurso aquí) y en sólo 16 horas logré hacer un mini juego sencillo de cocinar bacon pancakes! El arte fue completamente extraído de imágenes de Google y editado por mi en Gimp. El principal objetivo era practicar animaciones y eventos del animador de Unity, aprendí muchísimo!

Pronto viene otro juego, para un gamejam de Brackeys llamado #10hourgames en el que debo hacer un juego en 10 horas de desarrollo, no más, puedo tomar cuantos días necesite, pero debo contar las horas de trabajo y no exceder 10 (si, parece tonto, pero es una genial idea para administrar el tiempo y sacarle el mejor provecho) y aunque sólo llevo 30min de trabajo, ya he avanzado un poco.

Espero que se animen a participar en este tipo de iniciativas! La premisa es aprender, que es lo que más importa, porque te da las herramientas para usarlas al momento de trabajar.

Hasta la próxima entrada! (Que será pronto).

viernes, 14 de junio de 2013

Tutorial 0 - Configurar OpenGL (Windows)

Tutorial para configurar OpenGL en Windows

Primero que nada debemos tener instalado Microsoft Visual Studio Express, yo prefiero la versión 2010 pero puedes instalar la de tu preferencia, el tutorial estará basado en la versión VS C++ 2010 el cual puedes conseguir en este enlace escoge el idioma que quieras (yo lo dejé en inglés) descargalo e instalalo.

Ahora bien, necesitamos instalar freeglut. Freeglut es una librería open source alterna a GLUT, que fué originalmente creada con el fin de permitir al usuario manejar una ventana donde pueda desplegar contenido creado con OpenGL en los ejemplos del RedBook. GLUT no ha sido actualizada ni mantenido por mas de 10 años y por esta razón nace FreeGLUT.

Luego de la pequeña charla procedemos a descargar FreeGLUT desde este enlace, el cual es un zip que contiene la última versión de freeglut 2.8.1 (para la fecha de Junio 2013) con las librerías y dlls ya compilados. Si descargamos la versión 2.8.1 directamente del repositorio de freeglut tendremos que compilar un proyecto dentro de las carpetas para obtener la librería y dlls.

Ahora bien, en teoría, deberíamos configurar VS para que pueda usar las librerías y agregar los dlls al sistema, pero no, NO vamos a hacer eso, en mi opinión es una mala práctica porque "ensuciamos" el VS y además nuestro proyecto no sería portable, en cambio, con incluir los archivos necesarios directamente en el proyecto podemos tener un VS limpio y un proyecto que puedes pasar a un amigo para que lo pruebe y funciona sin tener que explicarle donde debe poner los dlls.

Iniciamos el Visual Studio y creamos un nuevo proyecto.


Seleccionamos Win32 Console Application, le ponemos nombre a nuestro proyecto y hacemos click en Ok


Next...


Aquí seleccionamos "Empty Project" y Finish


Ahora se ha creado nuestro proyecto, primero, debemos agregar un archivo main.cpp para lo cual hacemos click derecho sobre la carpeta "Sources" de nuestro proyecto y vamos a Add > New Item...


Aquí seleccionamos C++ File (cpp) y le ponemos nombre, en este caso, main.cpp




Ahora si, tenemos nuestro archivo main y le colocamos el siguiente código que intenta iniciar el entorno de OpenGL y levantar una ventana:

#include "GL/freeglut.h"
#include <stdio.h>

int main(int argc, char** argv) {
printf("glutInit\n");
glutInit(&argc, argv);
printf("glutInitDisplayMode\n");
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
printf("glutInitWindowPosition\n");
glutInitWindowPosition(100, 100);
printf("glutInitWindowSize\n");
glutInitWindowSize(320, 320);
printf("glutCreateWindow\n");
glutCreateWindow("Hello, World");
printf("done\n");
return 0;
}

Intentemos compilar tanto en Debug como en Release



Obvio... va a fallar, pero es necesario que lo hagamos al menos una vez, para que el VS cree las carpetas en las que va a colocar el archivo ejecutable.

Ahora, ¡vamos a hacer que funcione!

Primero vamos a la carpeta de nuestro proyecto, por lo general se encuentra en /Mis Documentos/Visual Studio 2010/Projects/ ahí vamos a ver nuestro proyecto de prueba:


Si entramos vamos a ver 3 carpetas: Debug, Release y test (esta última es donde se encuentran los archivos fuentes del proyecto). Ahora bien, ¿recuerdas el archivo de freeglut que bajaste al inicio del tutorial? bueno, vamos a descomprimir el archivo y colocar el dll, la librería y los archivos de freeglut en sus respectivas ubicaciones.


Primero, copiamos el archivo freglut.dll ubicado en "/freeglut/bin/" de la carpeta de freeglut que acabas de descomprimir y lo pegamos dentro de la carpeta Debug de nuestro proyecto (es importante que sea dentro de la carpeta que esta en "/Projects/test/Debug" ya que dentro de test hay otra carpeta debug que contiene los archivos objeto resultantes de la compilación, ahí no va a ir el .exe final)


Repetimos lo mismo pero esta vez pegamos el DLL en la carpeta Release.

Ahora entramos en la carpeta test y vemos que esta nuestro archivo main.cpp. Vamos a copiar la carpeta lib que está en freeglut y la pegamos dentro de "/Projects/test/test" y hacemos lo mismo con la carpeta GL dentro de "/freeglut/include" y deberíamos tener algo asi:


Volvemos a Visual Studio e intentamos compilar...

Pero... ¿qué pasó? ¡no encuentra la librería! bueno, visual studio no tiene conocimiento de que estas usando una librería aparte a las que tiene instaladas y no sabe donde se encuentra. Como lo dije en un principio, en teoría deberíamos decirle al VS dónde se encuentran todos nuestros archivos de freeglut (tanto los .lib como los .h y pegar el .dll en system32 de windows) pero para que nuestro proyecto sea portable a otros VS agregaremos una línea de código a nuestro archivo main.cpp que le dice al compilador dónde se encuentra la librería

#pragma comment (lib, "lib/freeglut.lib")

De este modo el compilador busca la librería en la carpeta lib de nuestro proyecto y ahora si es posible compilar y ejecutar el ejemplo de prueba.

Es recomendable probar tanto en Debug como en Release pero nuestros proyectos deben ser siempre compilados en Release porque de esa manera el programa corre más rápido debido a que no tiene código extra que le mete el VS al ejecutable para poderlo debuggear.

Una vez compilado y ejecutado, deberíamos poder ver en la consola que todas las pruebas de inicialización de OpenGL culminaron correctamente y además, durante la ejecución, se peude observar muy velozmente que se levanta una ventana y se cierra.

Con esto hemos culminado el Tutorial 0 para configurar OpenGL en Windows.

Tutorial 0 - Configurar OpenGL (Linux)

Tutorial para configurar OpenGL en Linux

Primero que nada debemos tener instalado en nuestra distribución de linux los compiladores esenciales.

sudo apt-get install build-essential g++

Con eso deberíamos tener instalado lo necesario para compilar nuestros códigos.

Ahora bien, necesitamos instalar freeglut. Freeglut es una librería open source alterna a GLUT, que fué originalmente creada con el fin de permitir al usuario manejar una ventana donde pueda desplegar contenido creado con OpenGL en los ejemplos del RedBook. GLUT no ha sido actualizada ni mantenido por mas de 10 años y por esta razón nace FreeGLUT.

Luego de la pequeña charla procedemos a descargar FreeGLUT desde este enlace.

Descomprimimos el archivo y entramos a la carpeta. Ejecutamos:

./configure

El programa intentará instalar cualquier dependencia faltante y configura el make. Ahora instalamos la librería con el siguiente comando:

make install

Ahora deberíamos tener instalado freeGLUT.

¡Vamos a probar!

El siguiente código intenta iniciar el entorno de OpenGL y levantar una ventana:

test.cpp

#include <GL/freeglut.h>
#include <stdio.h>

int main(int argc, char** argv) {
  printf("glutInit\n");
  glutInit(&argc, argv);
  printf("glutInitDisplayMode\n");
  glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
  printf("glutInitWindowPosition\n");
  glutInitWindowPosition(100, 100);
  printf("glutInitWindowSize\n");
  glutInitWindowSize(320, 320);
  printf("glutCreateWindow\n");
  glutCreateWindow("Hello, World");
  printf("done\n");
  return 0;
}


Ahora compilamos con el siguiente código:

g++ test.cpp -o test -lglut

-lglut le dice al compilador que use la librería de glut (algo así como usar los DLL y LIB en windows)

./test

Deberíamos poder ver en la consola que todas las pruebas de inicialización de OpenGL culminaron correctamente y además, durante la ejecución, se peude observar muy velozmente que se levanta una ventana y se cierra, pero, puede pasar en algunos casos (como a mi) que no termina el programa y nunca levanta la ventana, esto se debe a que el SO no le permite a OpenGL levantar la ventana, pero hay una solución y es colocar el siguiente código antes de glutCreateWindow();


if (!glutGet(GLUT_DISPLAY_MODE_POSSIBLE))
  { 
    exit(1); 
  }

Esto hace que glut intente solicitar un modo de despliegue, al hacer la comprobación el SO le permitirá levantar la ventana, compilamos y corremos, ¡voilá! ¡funciona!

Con esto hemos culminado el Tutorial 0 para configurar OpenGL en Linux.

martes, 11 de junio de 2013

Introducción

¡Bienvenido!

El objetivo de este blog es hacer una bitácora del progreso de mi tesis, pero al mismo tiempo mi intención es reunir y poner en orden mis conocimientos en OpenGL, GLSL y técnicas de computación gráfica que aprendí (y sigo aprendiendo) durante mis estudios en la Universidad Central de Venezuela. Lo hago mayormente para mi, como un ejercicio para recordar todas estas cosas pero también esperó que sirva de ayuda a alguien en el futuro.

En los últimos meses he leído un montón de libros, tutoriales, blogs y papers para la realización de mi tesis, sn embargo, he adquirido muchos conocimientos nuevos en OpenGL que quisiera implementar y compartir.

Aparte de llevar un log de mis avances en mi proyecto de tesis, lo que planeo tener a medio plazo es:

Tutoriales básicos:

  • Tutorial de OpenGL (Hola mundo!)
  • OpenGL 2D
  • OpenGL 3D - Model viewer
  • Texturing - OBJ loader
  • GLSL - new hello world
  • Phong shading
  • Multitexturing
  • Bump mapping
  • Volumetric shadows

Si consigo llevar buen ritmo, mis planes a largo plazo son:

Tutoriales avanzados:

  • Scene composition
  • Volume rendering
  • Marching cubes
  • Stereoscopic rendering
  • Terrain rendering
  • Relief mapping
Espero que consigan utilidad en mi blog! Disfrútenlo!