Buscando archivos y otras cosas

Mientras continuaba mis experimentaciones con shaders, decidí crear una función que cargara todos los vertex shaders y fragment shaders en el directorio actual. Después de haber trabajado con Python durante varios meses, volver al manejo de strings en C++ es verdaderamente horrible (Paul Graham, tenías razón!! 😀 ). Para evitar a otros rehacer el mismo trabajo, aca va el código fuente de la función de listado de archivos en Win32:

void listCurDir(std::vector<std::string>& fileList)
{
    WIN32_FIND_DATA fd;
    HANDLE h = FindFirstFile("*.*", &fd);
    fileList.clear();
    fileList.push_back(std::string(fd.cFileName));
    while (FindNextFile(h, &fd))
        fileList.push_back(std::string(fd.cFileName));
}

Todavía me falta bastante para sentirme cómodo con los shaders, pero ya voy entendiendo mejor como utilizarlos:

// Vertex shader
varying vec3 pos;
void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    pos = vec3(gl_Vertex);
}

// Fragment shader
varying vec3 pos;
void main()
{
    gl_FragColor = vec4(cos(5.0 * pos.z),
                        cos(8.0 * atan(pos.y, pos.x)),
                        cos(10.0 * pos.z),
                        0.0);
}
Ejemplo de esfera coloreada con fragment shaders.

Ejemplo de esfera coloreada con fragment shaders.

Seguiré experimentando…

Advertisement

Terrenos multifractales

Un campo de creciente interés, teniendo en cuenta las enormes cantidades de contenido requeridas en los juegos modernos, es la generación de contenido procedural. Esta técnica consiste en reemplazar datos almacenados por datos generados mediante la ejecución de un procedimiento, de ahí el nombre “procedural”. La aplicación de estas técnicas permite ver la enorme cantidad de información que puede almacenarse en solo 96K.

Aprovechando este “fin de semana largo”, estuve explorando la geometría procedural y, en particular, la generación de terrenos mediante la utilización de fractales. Se denomina fractal a una entidad geométrica que presenta la característica de ser “autosimilar” a distintas escalas, o sea que si observamos una pequeña porción del mismo se “parecerá” en un cierto sentido a la entidad en su conjunto.

Un fractal muy utilizado para la creación de terrenos aleatorios es el denomiado como “fractional Brownian motion” (fBm), consistente en la suma de distintas señales de ruido con bandas limitadas y con un factor de escala adecuado (para evitar que las altas frecuencias tengan amplitudes comparables a las bajas frecuencias). En la siguiente imagen puede observarse un terreno generado mediante esta técnica:

Imagen de un terreno fractal (algoritmo fBM).

Imagen de un terreno fractal (algoritmo fBm).

Sin embargo esta clase de terrenos no resulta visualmente muy atractiva, ya que es simétrico (en cuanto a forma general, no en cuanto a los detalles ya que es aleatorio) respecto al plano “h = 0”, problema que no puede resolverse utilizando fractales del tipo fBM. Una solución, descrita por Ken Musgrave en su tesis doctoral junto a muchas otras, consiste en el uso de multifractales. En mi caso particular, me decidí por el algoritmo descrito por el mismo Ken en la sección 2.3.2.5.1 de su tesis.

El resultado obtenido puede observarse en la siguiente figura:

Imagen de un terreno multifractal.

Imagen de un terreno multifractal.

El código utilizado para crear y navegar en tiempo real sobre este terreno puede obtenerse en mi repositorio en Google Code (se sale con ESC, las flechas giran en torno al punto central, PgUp/PgDn controlan la distancia).

Pueden verse otros terrenos mucho más espectaculares (aunque no generados para renderizarlos realtime) en MojoWorld.

[Nota: Agregué en la home del proyecto los binarios para descargar. Requieren tener instalados “los componentes runtime” del Visual C++ 9, que puede descargarse desde aquí.]

Infinito menos infinito

Muchas de las condiciones de aplicabilidad de los teoremas pueden ignorarse en la gran mayoría de los casos que se dan en la práctica. Por ejemplo, las condiciones de continuidad requeridas para poder asegurar la igualdad de “las derivadas parciales mixtas” se dan en todos los casos de interés práctico.  Asimismo, si tenemos en \mathbb{R}^3 un objeto topológicamente similar a una esfera, solo en casos patológicos puede tener un exterior que no sea simplemente conexo.

Pero un caso donde pueden darse particularmente esta clase de problemas (:-D) es en el manejo de integrales impropias. Supongamos que deseamos resolver la siguiente integral

\int_1^{\infty} \frac{1}{x^2+x} dx.

Mediante el método ordinario de fracciones simples llegamos a lo siguiente:

\int_1^{\infty} \frac{1}{x^2+x} dx = \int_1^{\infty} \frac{1}{x} - \frac{1}{x+1} dx = \int_1^{\infty} \frac{1}{x} dx - \int_1^{\infty} \frac{1}{x+1} dx.

Pero estas dos integrales divergen, dejándonos en una indeterminación del tipo \infty - \infty… solo que esta no es real, ya que la última igualdad que escribimos no es correcta. Una integral impropia es esencialmente un límite y la posibilidad de intercambiar el límite de una operación con la operación aplicada sobre los límites de los operandos solo se aplica en el caso de que estos últimos estén definidos.

Una forma correcta de resolver este problema es hacer explícito el límite:

\int_1^{\infty} \frac{1}{x^2+x} dx = \int_1^{\infty} \frac{1}{x} - \frac{1}{x+1} dx

\int_1^{\infty} \frac{1}{x^2+x} dx = \lim \limits_{b \to \infty}\int_1^b \frac{1}{x} - \frac{1}{x+1} dx

\int_1^{\infty} \frac{1}{x^2+x} dx = \lim \limits_{b \to \infty}\left[ \int_1^b \frac{1}{x} dx - \int_1^b \frac{1}{x+1} dx \right]

\int_1^{\infty} \frac{1}{x^2+x} dx = \lim \limits_{b \to \infty}\left[ \ln b - (\ln b - \ln 2) \right]

\int_1^{\infty} \frac{1}{x^2+x} dx = \ln 2.

Diálogo en un McDonalds en Brasil

Aparentemente los brasileros encuentran difícil pronunciar palabras en inglés (e imagino en otros idiomas) que estén terminadas en consonantes. Ya me habían comentado sobre este problema pero, como tantas otras cosas, es distinto cuando se experimenta de primera mano 😀 . El siguiente es un diálogo auténtico ocurrido hace unas semanas:

Yo: “Una ‘Big Mac’, por favor?.”
Empleado: “‘Biggie Mackie’?”
Yo: “Mmm. ” <pausa incómoda de unos 10 segundos hasta que hago la deconvolución> “Si, una ‘biggie mackie’.”

Eso me hace preguntar cuáles serán las dificultades similares que tendremos los hispanohablantes…