<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Varrojo@Linux &#187; OpenGL</title>
	<atom:link href="http://varrojo.algorithmia.net/category/opengl/feed/" rel="self" type="application/rss+xml" />
	<link>http://varrojo.algorithmia.net</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Tue, 23 Aug 2011 05:30:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Rendering Mapas de Quake 2 &#8211; Video</title>
		<link>http://varrojo.algorithmia.net/2010/12/15/rendering-mapas-de-quake-2-video/</link>
		<comments>http://varrojo.algorithmia.net/2010/12/15/rendering-mapas-de-quake-2-video/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 16:03:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1165</guid>
		<description><![CDATA[A modo de cierre del proyecto, dejo un sencillo video que publiqué en YouTube mostrando el Renderer de Quake 2 funcionando.]]></description>
			<content:encoded><![CDATA[<p>A modo de cierre del proyecto, dejo un sencillo video que publiqué en YouTube mostrando el Renderer de Quake 2 funcionando.</p>
<p><center><br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/s733nmgkJsE?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/s733nmgkJsE?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/12/15/rendering-mapas-de-quake-2-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rendering de Mapas de Quake 2 &#8211; Skybox</title>
		<link>http://varrojo.algorithmia.net/2010/12/05/rendering-de-mapas-de-quake-2-skybox/</link>
		<comments>http://varrojo.algorithmia.net/2010/12/05/rendering-de-mapas-de-quake-2-skybox/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 15:17:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1148</guid>
		<description><![CDATA[Tras un poco de trabajo extra, finalmente implementé soporte para dibujar una aproximación de los cielos del Quake 2. Algo que me tenía bastante confundido era cómo dibujar los polígonos que tenían mapeada una textura de cielo de la forma &#8230; <a href="http://varrojo.algorithmia.net/2010/12/05/rendering-de-mapas-de-quake-2-skybox/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tras un poco de trabajo extra, finalmente implementé soporte para dibujar una aproximación de los cielos del Quake 2.</p>
<p>Algo que me tenía bastante confundido era cómo dibujar los polígonos que tenían mapeada una textura de cielo de la forma en que se veían en el juego. Finalmente, lo que decidí hacer fue simplemente eliminar todos estos polígonos y dibujar una Skybox acorde a las dimensiones de la bounding box del mapa.<br />
<center><br />
<div id="attachment_1149" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/base2_sky_1.png"><img class="size-medium wp-image-1149" title="Cielo en base2" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/base2_sky_1-293x300.png" alt="" width="293" height="300" /></a><p class="wp-caption-text">Rendering del cielo en base2.bsp.</p></div><br />
</center><br />
Hasta donde tengo entendido, esto no se encuentra tan fuera de lo que se realizaba en el juego, ya que cada mapa BSP define un conjunto de texturas a mapear sobre una hipotética Skybox que no se encuentra definida en ningún lado. Esto me lleva a pensar que los polígonos mapeados con textura de cielo, los cuales ahora no se renderizan, son en realidad un artefacto para el algoritmo de determinación de visibilidad y no un instrumento visual.</p>
<p>Para renderizar el cielo desarrollé un nuevo Shader que elimina la porción de traslación de la matriz ModelView, haciendo que el cielo se encuentre &#8220;infinitamente&#8221; lejano. A nivel de mapeo de texturas, utilicé CLAMP_TO_EDGE para ocultar las aristas de la Skybox. El efecto es bastante sorprendente: incluso sabiendo dónde se ubican las aristas, resulta difícil notar las caras interiores de la Skybox.</p>
<p><center><br />
<div id="attachment_1150" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/base1_sky_1.png"><img class="size-medium wp-image-1150" title="Cuarto de exteriores en base1 con cielo" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/base1_sky_1-293x300.png" alt="" width="293" height="300" /></a><p class="wp-caption-text">Cuarto de exteriores en base1.bsp, renderizado con su cielo.</p></div></p>
<p><div id="attachment_1151" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/base1_sky_2.png"><img class="size-medium wp-image-1151" title="Cuarto final en base1.bsp con cielo" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/base1_sky_2-293x300.png" alt="" width="293" height="300" /></a><p class="wp-caption-text">Cuarto final en base1.bsp. Notar el cielo a través de las ventanas y el techo.</p></div><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/12/05/rendering-de-mapas-de-quake-2-skybox/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Redering de Mapas de Quake 2 &#8211; Texturas</title>
		<link>http://varrojo.algorithmia.net/2010/11/16/redering-de-mapas-de-quake-2-texturas/</link>
		<comments>http://varrojo.algorithmia.net/2010/11/16/redering-de-mapas-de-quake-2-texturas/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 15:33:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1090</guid>
		<description><![CDATA[Este artículo es una continuación de &#8220;Rendering de Mapas de Quake 2&#8220;. Tras bastante más trabajo del que estimé originalmente, finalmente logré agregar soporte para realizar Mapeo de Texturas sobre los mapas BSP de Quake 2. En este artículo voy &#8230; <a href="http://varrojo.algorithmia.net/2010/11/16/redering-de-mapas-de-quake-2-texturas/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este artículo es una continuación de &#8220;<a href="http://varrojo.algorithmia.net/2010/11/10/rendering-de-mapas-de-quake-2/">Rendering de Mapas de Quake 2</a>&#8220;. Tras bastante más trabajo del que estimé originalmente, finalmente logré agregar soporte para realizar Mapeo de Texturas sobre los mapas BSP de Quake 2. En este artículo voy a intentar explicar los detalles sobre como funcionan los archivos de textura utilizados por Quake 2, de forma de poder dibujar el mapa textureado por Hardware, utilizando OpenGL.<br />
<center><br />
<div id="attachment_1095" class="wp-caption aligncenter" style="width: 301px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_tex_0.png"><img class="size-medium wp-image-1095" title="Base 1 posicion de inicio" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_tex_0-291x300.png" alt="" width="291" height="300" /></a><p class="wp-caption-text">Primer mapa del Juego, renderizado desde la posición de inicio del jugador con mapeo de texturas.</p></div><br />
</center><br />
Quake 2 almacena sus texturas en un formato propio denominado WAL. Para realizar el mapeo de texturas fue necesario implementar soporte para este tipo de archivos de imagen. Los archivos WAL se almacenan dentro del archivo PAK del juego y son básicamente índices a una paleta de colores que también se encuentra dentro del PAK. Para poder recomponer la textura como una matriz RGB, es necesario disponer tanto de cada WAL individual como de la paleta y por lo tanto fue necesario desarrollar una forma de poder cargar estos archivos directamente desde el PAK.</p>
<p>La ventaja de soportar los archivos PAK originales del juego es que ahora puedo cargar los recursos del juego directamente desde ahí (incluso los mapas BSP), sin necesidad de previamente extraerlos.</p>
<p>Comenzemos estudiando la paleta de colores. La paleta se encuentra dentro del PAK bajo el nombre &#8220;pics/colormap.pcx&#8221;. Para poder acceder a su contenido es necesario cargarla en memoria desde el PAK como un BLOB. Este BLOB es una imagen codificada en PCX, y es necesario descomprimirla para poder utilizarla como una matriz de colores.</p>
<p>Luego, cada WAL correspondiente a un polígono es referenciado mediante su nombre y ruta dentro del PAK. Los WAL consisten principalmente en un header que determina, entre otras cosas, las dimensiones de la imagen y el offset donde comienzan los datos. Los datos a leer son exactamente w*h bytes a partir de offset[0]. Estos datos son una matriz de índices a la paleta de colores. Afortunadamente, estos datos no se encuentran codificados de ninguna forma y pueden utilizarse directamente para indexar la paleta de colores.</p>
<p>A modo de comentario, cada índice leído es exactamente un byte de tamaño, por lo cual los WAL en teoría no pueden referenciar más de 256 colores distintos en la paleta. Consecuentemente, uno esperaría que la paleta sea exactamente de 256*3 bytes, sin embargo, esto no es así. Quizás otros aspectos del motor utilizan la misma paleta y por eso existen colores que en principio no podrán ser referenciados.</p>
<p>Una vez que tenemos el WAL y la paleta, la textura se crea fusionándolos en una matriz de colores RGB. Esto se puede hacer de dos formas: se puede suministrar la paleta a OpenGL y luego crear una textura compuesta por índices, o bien, se puede fusionar la paleta con el WAL manualmente por Software y suministrar texturas 2D ya preparadas a OpenGL.</p>
<p>El primer enfoque tiene la ventaja de que se ahorra mucha memoria de video, ya que por cada textura, necesitamos almacenar solamente 1/3 de los datos que necesitaríamos para almacenar colores RGB (más la paleta una única vez). Por otro lado, este enfoque es más difícil de configurar a nivel de OpenGL (yo no logré hacerlo andar), requiere que la implementación de OpenGL soporte la extensión <strong>ARB_imaging</strong> y es más lento en tiempo de ejecución, ya que OpenGL deberá fusionar la paleta con los índices por cada cuadro. A su vez, OpenGL no soporta paletas del tamaño de la del Quake 2 e, incluso si lo hiciera, deberíamos convertir todas nuestras matrices de índices a dimensiones potencias de 2.</p>
<p>El segundo enfoque resuelve todos estos problemas al costo de consumir más memoria de video. Personalmente elegí este segundo enfoque, al costo de saber que probablemente mi renderer tenga problemas de performance en placas de video con poca RAM (64 MB?).</p>
<p>Si w,h son las dimensiones del archivo WAL, &#8220;textura&#8221; es una matriz de w*h*3 bytes, &#8220;indx&#8221; el <em>i-ésimo </em>índice del archivo WAL y &#8220;paleta&#8221; la paleta de colores, la forma de fusionar manualmente la paleta con los índices en un array es mediante la siguiente operación:</p>
<pre class="brush:cpp">
textura[i*3+0] = paleta[indx*3+0];
textura[i*3+1] = paleta[indx*3+1];
textura[i*3+2] = paleta[indx*3+2];
</pre>
<p>Donde<strong> i</strong> es un contador en el intervalo [0, w*h), y teniendo cuidado de no leer fuera del espacio de memoria de la paleta. Es válido referenciar colores fuera de la paleta, si bien los WAL de Quake 2 no parecen hacerlo. Si esto llegase a pasar, se deberá forzar el valor a negro (0x0).</p>
<p>La paleta se asume es un array unidimensional de la forma R,G,B, R,G,B, ... Es por esto que la forma en que se indexa la paleta es tal que el índice 0 corresponde a los primeros 3 bytes (0,1,2), el índice 1 corresponde a los siguientes 3 (3,4,5) y así sucesivamente.</p>
<p>Una vez creada nuestra textura RGB, la cargamos a OpenGL y ésta queda pronta para ser utilizada.</p>
<p>El último detalle a tener en cuenta es la diferencia entre los sistema de coordenadas de textura de Quake 2 y de OpenGL. Quake 2 utiliza un sistema de coordenadas en píxels, mientras que OpenGL utiliza un sistema normalizado. Para solucionar esta diferencia es necesario (tras calcular las coordenadas u,v de textura), dividir u y v entre el ancho y largo de la textura respectivamente. Esto no necesariamente producirá coordenadas en el intervalo [0,1], lo cual es esperable, ya que muchas de las texturas en Quake 2 deben dibujarse con Tiling.</p>
<p>Sin más detalles, les dejo a continuación un par de screenshots nuevos, esta vez con la iluminación deshabilitada pero con texturas mapeadas con filtrado bilineal.<br />
<center><br />
<div id="attachment_1093" class="wp-caption aligncenter" style="width: 301px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_tex_2.png"><img class="size-medium wp-image-1093" title="Ambiente Exterior en Base 1" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_tex_2-291x300.png" alt="" width="291" height="300" /></a><p class="wp-caption-text">Cuarto de Ambiente Exterior en Base 1, con mapeo de texturas. Notar los Triggers puestos en el cuarto para disparar eventos en el Juego y como el cielo se ve &quot;raro&quot; al dibujarlo como cualquier otro polígono.</p></div></p>
<p><div id="attachment_1094" class="wp-caption aligncenter" style="width: 301px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_tex_1.png"><img class="size-medium wp-image-1094" title="Cuarto donde está escondida la Shotgun en Base 1." src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_tex_1-291x300.png" alt="" width="291" height="300" /></a><p class="wp-caption-text">Cuarto escondido en Base 1.</p></div><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/11/16/redering-de-mapas-de-quake-2-texturas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rendering de Mapas de Quake 2</title>
		<link>http://varrojo.algorithmia.net/2010/11/10/rendering-de-mapas-de-quake-2/</link>
		<comments>http://varrojo.algorithmia.net/2010/11/10/rendering-de-mapas-de-quake-2/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 22:24:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1066</guid>
		<description><![CDATA[Estos últimos días tuve que quedarme en cama, y aproveché el tiempo para investigar y experimentar (cuando podía leer) sobre el formato interno de los mapas de Quake 2. Internamente, los mapas de Quake 2 son un Árbol BSP con &#8230; <a href="http://varrojo.algorithmia.net/2010/11/10/rendering-de-mapas-de-quake-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estos últimos días tuve que quedarme en cama, y aproveché el tiempo para investigar y experimentar (cuando podía leer) sobre el formato interno de los mapas de Quake 2.<br />
<center><br />
<div id="attachment_1068" class="wp-caption aligncenter" style="width: 302px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_0.png"><img class="size-medium wp-image-1068" title="base1.bsp" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_0-292x300.png" alt="" width="292" height="300" /></a><p class="wp-caption-text">Primer mapa del Juego, renderizado desde la posición de inicio del jugador.</p></div><br />
</center><br />
Internamente, los mapas de Quake 2 son un Árbol BSP con información de &#8220;visibilidad&#8221;. Esto se debe a que el motor del Quake 2 era un híbrido entre un motor de Árboles BSP y Portal Engine, utilizando el árbol para determinar rápidamente la hoja en la cual se encuentra la cámara y luego la información de visibilidad para descartar grandes porciones de los mapas a la hora de dibujar.</p>
<p>El formato es relativamente simple de leer ya que básicamente se trata de un conjunto de blobs con un directorio. Esto hace que sea extremadamente sencillo de levantarlo desde C o C++.</p>
<p>La mayor dificultad con la que me encontré consistió en dar un formato a estos datos que sea razonable para enviarlos a OpenGL en forma eficiente (recordemos que es un formato del &#8217;97). Particularmente, a mi gusto, existe demasiada &#8220;distancia&#8221; entre las hojas del Árbol BSP que contienen geometría y los detalles de la misma, debiendo atravesar varias tablas para llegar desde una hoja que se sabe visible hasta las coordenadas de los vértices que componen todos sus polígonos.</p>
<p>Finalmente se me ocurrió una forma de transformar todos los polígonos para evitar el tener que estar saltando entre 6 tablas cada cuadro a dibujar : )</p>
<p>El renderer dispone de un sistema de iluminación muy básico, con luces direccionales y brillo especular.</p>
<p>Los próximos pasos que me gustaría realizar serían implementar el mapeo de texturas (idealmente leyendo los archivos .wal originales del juego desde el paquete .pak) y el descartado de geometría mediante el cálculo del PVS.</p>
<p>Les dejo algunos screenshots.<br />
<center><br />
<div id="attachment_1069" class="wp-caption aligncenter" style="width: 302px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_2.png"><img class="size-medium wp-image-1069 " title="base1 exteriores" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_2-292x300.png" alt="" width="292" height="300" /></a><p class="wp-caption-text">Cuarto de &quot;Exteriores&quot; en base1.bsp</p></div></p>
<p><div id="attachment_1070" class="wp-caption aligncenter" style="width: 302px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base2_1.png"><img class="size-medium wp-image-1070 " title="base2 vigas" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base2_1-292x300.png" alt="" width="292" height="300" /></a><p class="wp-caption-text">Cuarto de inicio del segundo mapa (base2.bsp).</p></div><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/11/10/rendering-de-mapas-de-quake-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducción a OpenGL ES 1.1</title>
		<link>http://varrojo.algorithmia.net/2010/10/14/introduccion-a-opengl-es-1-1/</link>
		<comments>http://varrojo.algorithmia.net/2010/10/14/introduccion-a-opengl-es-1-1/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 13:59:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1017</guid>
		<description><![CDATA[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.]]></description>
			<content:encoded><![CDATA[<p>Encontré en YouTube este excelente video que realiza una introducción rápida, estilo crash-course, a OpenGL ES 1.1.</p>
<p>El video es parte del curso de Desarrollo de Aplicaciones para iPhone de la Universidad de Stanford.</p>
<p>Dejo el video a continuación.</p>
<p><center><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/_WcMe4Yj0NM?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/_WcMe4Yj0NM?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/10/14/introduccion-a-opengl-es-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shaders GLSL y OpenGL</title>
		<link>http://varrojo.algorithmia.net/2010/09/12/shaders-glsl-y-opengl/</link>
		<comments>http://varrojo.algorithmia.net/2010/09/12/shaders-glsl-y-opengl/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 22:43:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=993</guid>
		<description><![CDATA[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 &#8230; <a href="http://varrojo.algorithmia.net/2010/09/12/shaders-glsl-y-opengl/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Los Shaders son una herramienta sumamente útil cuando estamos desarrollando aplicaciones visuales.</p>
<p>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.</p>
<p>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.</p>
<p>En Lighthouse 3D se presenta un <a href="http://www.lighthouse3d.com/opengl/glsl/index.php?intro">tutorial</a> 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.<br />
<center><br />
<div id="attachment_994" class="wp-caption aligncenter" style="width: 471px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/09/ogl-glsl-overview.gif"><img class="size-full wp-image-994" title="OpenGL - GLSL" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/09/ogl-glsl-overview.gif" alt="" width="461" height="375" /></a><p class="wp-caption-text">Carga de Shaders escritos en GLSL desde OpenGL. Fuente: Lighthouse 3D.</p></div><br />
</center><br />
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.</p>
<p>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.</p>
<p>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 &#8220;Pythonizar&#8221; esta porción de la API, simplificando mucho todo el proceso.</p>
<p>Les recomiendo revisar el tutorial en Lighthouse 3D o bien dirigirse a <a href="http://www.opengl.org">opengl.org</a> para encontrar la referencia completa de cada una de estas funciones y de GLSL.</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/09/12/shaders-glsl-y-opengl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grupo Khronos anuncia OpenGL 4.1</title>
		<link>http://varrojo.algorithmia.net/2010/07/27/khronos-anuncia-opengl-4-1/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/27/khronos-anuncia-opengl-4-1/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 17:46:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=925</guid>
		<description><![CDATA[Leo en opengl.org que el Grupo Khronos, anunció recientemente la disponibilidad de la especificación para OpenGL 4.1. Khronos realizó el anuncio durante la conferencia SIGGRAPH 2010 que se está llevando a cabo esta semana en Los Angeles. Este es el &#8230; <a href="http://varrojo.algorithmia.net/2010/07/27/khronos-anuncia-opengl-4-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Leo en opengl.org que el Grupo Khronos, anunció recientemente la disponibilidad de la especificación para OpenGL 4.1. Khronos realizó el anuncio durante la conferencia <a href="http://www.siggraph.org/s2010/">SIGGRAPH 2010</a> que se está llevando a cabo esta semana en Los Angeles.</p>
<p>Este es el sexto update a la especificación realizado en tan solo dos años. Entre las nuevas características anunciadas se encuentra soporte para la API de OpenGL ES 2.0 (ahora OpenGL es un superconjunto de OpenGL ES 2.0), soporte para trabajar con Shaders en formato binario y soporte para punto flotante de 64 bits para Vertex Shaders, entre otras.</p>
<p>De acuerdo con <a href="http://developers.slashdot.org/story/10/07/26/2344203/OpenGL-41-Specification-Announced">algunos sitios</a>, las nuevas características estarían poniendo a OpenGL por delante de DirectX 11 en términos de funcionalidades, principalmente debido al hecho de poder desarrollar programas para dispositivos móviles y de escritorio utilizando la misma API, algo que de momento no se puede realizar con ninguna versión de DirectX.</p>
<p>Vía <a href="http://www.opengl.org/">opengl.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/27/khronos-anuncia-opengl-4-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algorithmia en el iOS Hackathon</title>
		<link>http://varrojo.algorithmia.net/2010/07/09/ios-hackathon/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/09/ios-hackathon/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 23:55:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=893</guid>
		<description><![CDATA[Durante esta semana estuvimos orgullosamente presentes en el iOS Hackathon, parte del OpenDay organizado por Globant LLC. Globant es una de las mayores compañías de Outsourcing en el Cono Sur. En el evento desarrollamos una aplicación para iPad que utiliza &#8230; <a href="http://varrojo.algorithmia.net/2010/07/09/ios-hackathon/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Durante esta semana estuvimos orgullosamente presentes en el iOS Hackathon, parte del OpenDay organizado por Globant LLC. Globant es una de las mayores compañías de Outsourcing en el Cono Sur.</p>
<p>En el evento desarrollamos una aplicación para iPad que utiliza la tarjeta de video del dispositivo para calcular y desplegar los conjuntos de Julia-Fatou y Mandelbrot. La siguiente imagen muestra la Demo ejecutando sobre el Simulador de iPad:<br />
<center><br />
<div id="attachment_900" class="wp-caption aligncenter" style="width: 239px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/07/iFractals-Julia.png"><img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/07/iFractals-Julia-229x300.png" alt="iFractals, ejecutando sobre el Simulador de iPad" title="iFractals Julia" width="229" height="300" class="size-medium wp-image-900" /></a><p class="wp-caption-text">iFractals, ejecutando sobre el Simulador de iPad</p></div><br />
</center></p>
<p>La implementación fue realizada utilizando Fragment Shaders de OpenGL ES, con el fin de utilizar la GPU del iPad como un coprocesador en paralelo, capaz de evaluar los Fractales virtualmente al mismo tiempo para cada pixel visible en la pantalla del dispositivo.</p>
<p>Después de desarrollar la Demo, el expositor de Globant nos invitó a explicar el concepto y tecnologías utilizadas a la Audiencia utilizando un iPad real.</p>
<p>Les dejo unas fotos del evento debajo.<br />
<center><br />
<div id="attachment_894" class="wp-caption aligncenter" style="width: 225px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/07/iPad-Mandelbrot.png"><img class="size-medium wp-image-894" title="iPad Mandelbrot" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/07/iPad-Mandelbrot-215x300.png" alt="El conjunto de Mandelbrot, renderizado en un iPad." width="215" height="300" /></a><p class="wp-caption-text">El conjunto de Mandelbrot, renderizado en un iPad.</p></div></p>
<p><div id="attachment_895" class="wp-caption aligncenter" style="width: 230px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/07/iPad-Julia.png"><img class="size-medium wp-image-895" title="iPad Julia" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/07/iPad-Julia-220x300.png" alt="El conjunto de Julia, renderizado en un iPad." width="220" height="300" /></a><p class="wp-caption-text">El conjunto de Julia para c=-0.012+0.74i, renderizado en un iPad.</p></div><br />
</center><br />
Agradecemos a Globant por la oportunidad de presentar nuestra Demo en su conferencia.</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/09/ios-hackathon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Animación Interpolada para Modelos de Quake 2</title>
		<link>http://varrojo.algorithmia.net/2010/06/27/animacion-interpolada-para-modelos-de-quake-2/</link>
		<comments>http://varrojo.algorithmia.net/2010/06/27/animacion-interpolada-para-modelos-de-quake-2/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 21:27:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=869</guid>
		<description><![CDATA[En un artículo anterior les comentaba que había estado desarrollando un programa para cargar y dibujar modelos del juego &#8220;Quake 2&#8243; de Id Software. En dicho artículo les mencionaba, a grandes rasgos, el contenido del archivo y cómo éste representa &#8230; <a href="http://varrojo.algorithmia.net/2010/06/27/animacion-interpolada-para-modelos-de-quake-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En un <a href="http://varrojo.algorithmia.net/2010/06/19/rendering-modelos-quake2/">artículo anterior</a> les comentaba que había estado desarrollando un programa para cargar y dibujar modelos del juego &#8220;Quake 2&#8243; de Id Software. En dicho artículo les mencionaba, a grandes rasgos, el contenido del archivo y cómo éste representa las animaciones mediante el uso de keyframes.</p>
<p>Hasta el momento, el rendering de la animación era realizado sin interpolar entre keyframes, lo cual causaba que la animación se viera un poco tosca. Ayer estuve trabajando en agregar interpolación entre keyframes; El resultado fue un gran suavizado del proceso de animación.</p>
<p>Dejo un nuevo video a continuación. En él podrás notar que, incluso animando a tan solo 2 frames por segundo, pero interpolando, la animación se ve mucho más continua, a pesar de que el video anterior se había generado a 10 frames por segundo.</p>
<p><center><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/7WYSS5Zz2xs&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/7WYSS5Zz2xs&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
</center></p>
<p>¿Notas la diferencia? El costo que tenemos que pagar por la interpolación ciertamente es un aumento en el overhead de CPU que tenemos para dibujar cada cuadro.</p>
<p>En el caso particular de éste modelo, cada keyframe se compone de 610 triángulos, cada triángulo de 3 vértices y cada vértice de 5 floats. Así (solo para dibujar éste modelo), entre cada cuadro, tendremos que interpolar ni más ni menos que ¡<strong>9150</strong> floats! un proceso relativamente costoso que además aumenta con cada modelo adicional que queremos dibujar.</p>
<p>Como suele suceder en todo lo que tiene que ver con Computación Gráfica, la mejora en el realismo visual se financia a razón de performance. En este caso, no queda duda que el costo en términos de CPU es bien compensado por la mejora visual.</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/06/27/animacion-interpolada-para-modelos-de-quake-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rendering de Modelos de Quake 2</title>
		<link>http://varrojo.algorithmia.net/2010/06/19/rendering-modelos-quake2/</link>
		<comments>http://varrojo.algorithmia.net/2010/06/19/rendering-modelos-quake2/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 22:52:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=827</guid>
		<description><![CDATA[Durante la semana pasada aproveché un par de días de ocio para trabajar en un proyecto personal. La idea consistía en cargar un modelo de popular juego de 1996 1997 de Id Software &#8220;Quake 2&#8243; y dibujarlo en la pantalla. El &#8230; <a href="http://varrojo.algorithmia.net/2010/06/19/rendering-modelos-quake2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Durante la semana pasada aproveché un par de días de ocio para trabajar en un proyecto personal.</p>
<p>La idea consistía en cargar un modelo de popular juego de 1996 1997 de Id Software &#8220;Quake 2&#8243; y dibujarlo en la pantalla.</p>
<p>El Quake 2 consistió en uno de mis juegos favoritos en la saga (que actualmente se compone de 4 juegos) y cargar sus modelos 3D y verlos animados fué como un viaje instantáneo a un pasado nostálgico.</p>
<p>El formato que utiliza el Quake 2 para sus modelos consiste en un archivo binario muy fácil de leer desde código C o C++.</p>
<p>En este archivo se definen una serie de vértices y triángulos del modelo organizados en &#8220;keyframes&#8221;: una serie de poses que permiten dibujar el modelo con animación. El archivo también referencia cero o más texturas en formato PCX a utilizarse como &#8220;piel&#8221; del modelo, en terminología del Quake 2.</p>
<p>Una vez que el modelo y su textura se encuentran cargados en memoria, utilizo OpenGL y GLUT para dibujarlo.</p>
<p>Les dejo un video que subí a YouTube con el renderer en acción. El video fue generado dibujando 10 frames por segundo y sin interpolar entre keyframes, lo cual hace que la animación sea un poco tosca y no tan suave como se podría haber hecho.</p>
<p><center><br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/s56LG-bp370&amp;hl=en_US&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/s56LG-bp370&amp;hl=en_US&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
</center><br />
Disculpen por el final algo trunco, pero YouTube al parecer le cortó un par de segundos del final.</p>
<p>Esperen más información en los próximos días <img src='http://varrojo.algorithmia.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/06/19/rendering-modelos-quake2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

