Introducción a OpenGL ES 1.1

Encontré en YouTube este excelente video que realiza una introducción rápida, estilo crash-course, a OpenGL ES 1.1.

El video es parte del curso de Desarrollo de Aplicaciones para iPhone de la Universidad de Stanford.

Dejo el video a continuación.



Posted in iPhone, Objective-C, OpenGL, Programacion | Comments Off on Introducción a OpenGL ES 1.1

20 de Oct: Evento "Back to the Mac"

El evento que realizará Apple el 20 de Octubre, denominado “Back to the Mac”, parecería sugerir que se están preparando para liberar una nueva versión de Mac OS X y/o nuevos productos Mac.


Back to the Mac, Logo del Evento

Back to the Mac, Logo del Evento


Pensaría que, de liberar nuevo Hardware, probablemente se trate de Macbooks, ya que la línea no se ha refrescado desde hace algún tiempo (al menos no desde que incluyeron los nuevos procesadores “Core i” de Intel) y el Macbook Air realmente necesita un merecido reboot.

El León escondido en la parte de atrás de la manzanita parece sugerir muy claramente, sin embargo, que se viene una nueva interación del OS.

Personalmente, actualicé de 10.5 a 10.6 hace menos de un mes y, si bien disfruto de las nuevas features del sistema operativo, también estoy sufriendo con un par de bugs que no estaban presentes en la versión anterior.

Vía Gizmodo.

Posted in Apple, Eventos, Mac OS X | Comments Off on 20 de Oct: Evento "Back to the Mac"

John Carmack: C++ vs C

Visto en el Twitter de John Carmack:

“IMO, good C++ code is better than good C code, but bad C++ can be much, much worse than bad C code”.

Ahora que lo veo, tiendo a estar 100% de acuerdo : )

Posted in C++, Programacion | Comments Off on John Carmack: C++ vs C

Mythbusters: CPU vs GPU

En este video, los Mythbusters Adam y Jamie explican la diferencia entre como trabaja una CPU y como trabaja una Placa de Video (o GPU). Este video es de la conferencia NVISION ’08.



El video es un poco largo (casi 10 minutos), pero es muy entretenido y explica la diferencia en forma muy visual y muy clara.

Posted in Computación Gráfica, Video | Comments Off on Mythbusters: CPU vs GPU

Shaders GLSL y OpenGL

Los Shaders son una herramienta sumamente útil cuando estamos desarrollando aplicaciones visuales.

No solo nos permiten programar dentro del pipeline de la Tarjeta de Video para desarrollar efectos visuales sorprendentes, sino que además nuestros programas se ejecutan automáticamente en paralelo sobre cada uno de los vértices o fragmentos (dependiendo del tipo de Shader), permitiendo acelerar muchísimo algunas operaciones que, de ser realizadas en la CPU, frenarían toda la aplicación.

Los Shaders se desarrollan en lenguajes de programación especiales y deben ser compilados en tiempo de ejecución sobre la plataforma en la cual nuestra aplicación está ejecutando. El lenguaje de Shading compañero de OpenGL es GLSL (GL Shading Language) y su desarrollo también se encuentra a cargo del Grupo Khronos.

En Lighthouse 3D se presenta un tutorial muy claro (si bien un poquito desactualizado) que explica cómo cargar Shaders GLSL, compilarlos y adjuntarlos a un programa. Lo que me llamó la atención particularmente en el sitio fue el siguiente esquema, el cual resume visualmente todo proceso.


Carga de Shaders escritos en GLSL desde OpenGL. Fuente: Lighthouse 3D.



El lector cauteloso notará inmediatamente la similitud entre el proceso de compilación de Shaders GLSL y el proceso de compilación de programas C. Esto no es casualidad; Ya que GLSL está basado en C, es razonable que el Grupo Khronos se decidiera a basarse también en su modelo de compilación.

Algo a notar es que esta figura deja por fuera todo el proceso de interacción de la aplicación con los programas GLSL compilados, así como el proceso de limpieza de recursos posterior. Pueden revisar el resto del tutorial para obtener un pantallazo de cómo se realizan estas otras tareas.

Como es de esperarse, el tutorial asume que estamos trabajando en C, no obstante, trabajando desde Python con PyOpenGL, el proceso de carga de archivos de texto con código fuente GLSL, así como su carga a OpenGL es extremadamente sencillo. Esto es principalmente debido a que las construcciones de Python para E/S son extremadamente sencillas y, aparentemente, los desarrolladores de PyOpenGL se tomaron el trabajo de “Pythonizar” esta porción de la API, simplificando mucho todo el proceso.

Les recomiendo revisar el tutorial en Lighthouse 3D o bien dirigirse a opengl.org para encontrar la referencia completa de cada una de estas funciones y de GLSL.

Posted in OpenGL | Comments Off on Shaders GLSL y OpenGL

C++ Templates & Maps

El otro día luchaba contra una construcción de C++ con la que no había tenido problemas antes. Estaba intentando iterar sobre un map del cual el segundo parámetro estaba templetizado.

Mi construcción era similar a tener:

map< string, vector<T*> > m;

Supongamos que escribimos una función que itera sobre este mapa, haciendo algo con los pares (string, vector):

template <typename T>
void f()
{
    map< string, vector<T*> > m;

    for (map< string, vector<T*> >::iterator it = m.begin(); it != m.end(); it++)
   {
        // hacer algo con las tuplas
   }
}

Al momento de compilar, y muy para mi sorpresa, g++ reporta varios errores:

ejemplo.cpp: In function ‘void f()’:
ejemplo.cpp:15: error: expected ‘;’ before ‘it’
ejemplo.cpp:16: error: ‘it’ was not declared in this scope
ejemplo.cpp: In function ‘void f() [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]’:
ejemplo.cpp:24:   instantiated from here
ejemplo.cpp:15: error: dependent-name ‘std::map::iterator’ is parsed as a non-type, but instantiation yields a type
ejemplo.cpp:15: note: say ‘typename std::map::iterator’ if a type is meant

Aparentemente, y como nos indica g++ en su mensaje último de error, cuando tenemos un mapa templetizado, y queremos iterar sobre él, debemos agregar la keyword typename a la izquierda de la declaración del tipo de iterador, de la siguiente manera:

for (typename map< string, vector<T*> >::iterator it = m.begin(); it != m.end(); it++)
{
     // hacer algo con las tuplas
}

Realmente no lo tenía presente.

La nueva versión de C++, denominada C++0x, agregará la keyword auto, la cual indica al compilador que ha de inferir automaticamente el tipo de la variable asociada a partir del valor al cual se inicializa (similar al var de C#). auto permitirá evitar problemas de este estilo en el futuro, así como simplificar la lectura de código que ha de iterar sobre contenedores de la STL.

Posted in C++, Programacion | 3 Comments

C++ StringStreams

Fernando Briano, de Picando Código, está con un artículo muy interesante hoy sobre StringBuilders y StringBuffers de Java. El artículo describe el por qué un desarrollador querría hacer uso de éstos en vez de los operadores sobrecargados de String (como “+”) para concatenar Strings.

La clase string de C++, definida dentro del cabezal <string> y bajo el namespace std, también provee un operador sobrecargado de “+” para concatenar instancias de strings pero, al igual que en Java, existen circunstancias en las cuales es mejor utilizar un buffer para concatenar, por ejemplo, para evitar crear muchos objetos temporales en el stack (nótese que a diferencia de Java, en C++ podemos crear objetos tanto en el Stack como en el Heap.).

La clase stringstream, también del namespace std pero definida en el cabezal <sstream> provee una funcionalidad similar al StringBuilder de Java, pero haciendo uso del operador de inserción de flujos de C++ (<<). Los stringstreams permiten insertar cualquier tipo de dato dentro del flujo. Todos serán convertidos automáticamente a strings y concatenados.

A continuación un ejemplo:

#include <iostream>
using std::cout;
using std::endl;

#include <sstream>
using std::stringstream;

int main(int argv, char* argv[])
{
    // Creamos un stringstream y concatenamos varias constantes:
    stringstream ss;
    ss << "Picando" << " " << "Codigo" << "; btw PI = " << 3.14159;

    // Imprimimos el string en la salida estándar:
   cout << ss.str() << endl;

   return 0;
}

A diferencia de Java, los stringstreams también pueden utilizarse para tokenizar strings. En este caso seteamos el string directamente y luego utilizamos el operador de extracción de flujo (>>) para obtener los tokens:

#include <sstream>
using std::stringstream;

int main(int argc, char* argv[])
{
    stringstream ss;
    ss.str("Tokenizame 2 4.0");

    string s;
    int i;
    double d;

    // Extrae, convierte a los tipos apropiados y asigna, todo en una sola línea:
    ss >> s >> i >> d;
    return 0;
}

Interesante, ¿no? Gran parte de la flexibilidad de los stringstreams viene de la posibilidad de C++ de sobrecargar operadores, lo cual permite simplificar la lectura de las rutinas que trabajan con entrada salida de flujos, ya sea E/S a la terminal o E/S a un buffer de strings.

Posted in C++, Programacion | Comments Off on C++ StringStreams

La Paradoja de Pinocho

Supongo que esto es algo que se les escapó a los de Disney…


La Paradoja de Pinocho: "Mi nariz crecerá ahora"

La Paradoja de Pinocho: "Mi nariz crecerá ahora"


Posted in Comics | Comments Off on La Paradoja de Pinocho

Quake 4 en Fedora Linux

En este artículo brindo los detalles sobre como Instalar y Configurar el Quake 4 sobre una instalación de Fedora 12 de 64 bits.

Antes de comenzar, quiero advertirte que configurar este juego para que funcione correctamente (en el idioma deseado, con aceleración 3D y sonido) en Linux es una tarea bastante complicada que requiere paciencia y algo de experimentación. Definitivamente no estamos hablando de un proceso exacto, sino que (dependiendo de tu distribución) puede que sea necesario revisar otros tutoriales y experimentar con diversos settings.


Quake 4 Logo

Quake 4



Algo que casi seguramente deberás hacer es agregar o quitar componentes de tu sistema operativo que quizás lo dejen inutilizable si quedan mal configurados. Lo importante es tomar esto como una tarea de experimentación y aprendizaje y no comenzar a hacer las cosas que otros recomiendan en sus blogs o en entradas de foros sin comprender el por qué, sino realmente intentar comprender qué hacemos y por qué lo hacemos.

Si bien todo esto suena complicado, sobre todo si comparamos con el proceso de instalación sobre MS Windows, puedo decirte que el sentimiento de satisfacción con uno mismo al hacer funcionar el juego sobre Linux es muy superior : )

Comencemos…

Continue reading

Posted in Linux, Video Juegos | 1 Comment

Portando de DOS a Windows

Ayer leía en Slashdot sobre la historia del Port de Death Rally, un juego desarrollado por una empresa ya difunta llamada Apogee y del cual los derechos son ahora de la Finlandesa Remedy Edit: Resulta que la Finlandesa Remedy desarrolló el Juego y Apogee fue solamente el Publisher.

Extraído del artículo:

“La plataforma original era DOS, Watcom C, y un extensor de DOS estilo DOS4GW. El extensor básicamente significaba que podías utilizar más de 640k de memoria, y no necesitarías código extraño para datos mayores a 64k.

El juego desplegaba en los modos gráficos VESA 640×480 y MCGA 320×200, todos con paletas de 8 bits; No había color real en ninguna parte. También habían algunos trucos de cambios de paleta cada cuadro con los cuales los emuladores tienen problemas.

El código fuente era mayoritariamente C puro, con un par de docenas de funciones assembly embebidas. Un par de subsistemas se encontraban faltantes, específicamente audio y red, los cuales tendrían que ser reemplazados completamente de todos modos, al igual que un archivo para el cual el código fuente se había perdido y solo un objeto compilado estaba disponible.”

La historia cuenta los detalles del port; En general tiene mucho que ver con los problemas que uno suele encontrarse cuando desea adaptar una aplicación DOS a Windows. Uno de los problemas más comunes es que en DOS, uno podía programar a muy bajo nivel, haciendo a un lado al Sistema Operativo y trabajando directamente sobre el Hardware.

Una solución que me llamó la atención consistió en como resolver el problema de que para dibujar en la pantalla, el programa escribía en memoria de video directamente (en la dirección 0xa000). La solución fue, en vez de rehacer todo este código, crear una array del tamaño apropiado, almacenar un puntero global (llamado g0xa000) y reemplazar las escrituras.

Pueden seguir leyendo los detalles del port en el artículo original y también pueden descargar el Death Rally gratis para Windows (XP, Vista, 7) desde la página de Remedy.

Posted in Programacion, Video Juegos | Comments Off on Portando de DOS a Windows