<?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; Programacion</title>
	<atom:link href="http://varrojo.algorithmia.net/category/programacion/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>Artículo de Linux Journal disponible para leer en línea</title>
		<link>http://varrojo.algorithmia.net/2011/02/07/articulo-linux-journal-en-line/</link>
		<comments>http://varrojo.algorithmia.net/2011/02/07/articulo-linux-journal-en-line/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 16:05:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CUDA]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1185</guid>
		<description><![CDATA[Me complace el poder anunciar que el artículo introductorio a CUDA que escribí para RealityFrontier, y que fuera publicado por la revista Linux Journal, se encuentra disponible en línea para ser leído. Puedes encontrar el artículo aquí: http://goo.gl/jFz3z. En él &#8230; <a href="http://varrojo.algorithmia.net/2011/02/07/articulo-linux-journal-en-line/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1188" title="Linux-Journal-cover-200" src="http://varrojo.algorithmia.net/wp-content/uploads/2011/02/Linux-Journal-cover-200.jpg" alt="" width="120" height="161" />Me complace el poder anunciar que el artículo introductorio a CUDA que escribí para RealityFrontier, y que fuera publicado por la revista Linux Journal, se encuentra disponible en línea para ser leído.</p>
<p>Puedes encontrar el artículo aquí: <a title="http://www.linuxjournal.com/article/10840/?page=0,0" rel="nofollow" href="http://goo.gl/jFz3z" target="_blank">http://goo.gl/jFz3z</a>. En él encontrarás una introducción a la programación en paralelo usando la tecnología CUDA de NVIDIA y unos screenshots que tomé con un programa que escribí específicamente para ayudar a exponer los conceptos tratados en el artículo.</p>
<p>Si lo deseas, puedo dejar un link a todo el código fuente del artículo, utilizado para realizar los benchmarks. Tan solo déjame un comentario.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2011/02/07/articulo-linux-journal-en-line/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Ceibal-Chess Beta 3 disponible</title>
		<link>http://varrojo.algorithmia.net/2010/12/09/ceibal-chess-beta-3-disponible/</link>
		<comments>http://varrojo.algorithmia.net/2010/12/09/ceibal-chess-beta-3-disponible/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 14:11:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ceibal-chess]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1159</guid>
		<description><![CDATA[Ha pasado algún tiempo, sin embargo me complace poder anunciar la disponibilidad de la Beta 3 de Ceibal-Chess para las plataformas XO, PC y Mac. La nueva Beta nos aproxima mucho a la tan esperada versión 1.0 que esperamos poder &#8230; <a href="http://varrojo.algorithmia.net/2010/12/09/ceibal-chess-beta-3-disponible/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ha pasado algún tiempo, sin embargo me complace poder anunciar la disponibilidad de la Beta 3 de Ceibal-Chess para las plataformas XO, PC y Mac. La nueva Beta nos aproxima mucho a la tan esperada versión 1.0 que esperamos poder liberar justo a tiempo para esta Navidad.<br />
<center><br />
<div id="attachment_1160" class="wp-caption aligncenter" style="width: 310px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/Ceibal-Chess-es_UY.png"><img class="size-medium wp-image-1160" title="Ceibal-Chess-es_UY" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/12/Ceibal-Chess-es_UY-300x231.png" alt="Ceibal-Chess en Español de Uruguay" width="300" height="231" /></a><p class="wp-caption-text">Ceibal-Chess en Español de Uruguay</p></div><br />
</center><br />
Esta nueva versión de Ceibal-Chess incluye varias mejoras, concentrándose principalmente en las siguientes áreas:</p>
<ul>
<li>Mejor Integración con Sugar.</li>
<li>Internacionalización, soporte para Español e Inglés.</li>
<li>Mejoras Visuales*</li>
</ul>
<p><strong>Mejor Integración con Sugar</strong></p>
<p>La nueva versión hace uso del excelente paquete &#8220;sugargame&#8221; para mejorar significativamente la integración entre Pygame y Sugar.</p>
<p>La Beta 3 permite acceder al Marco y terminar/reanudar la Actividad desde la Vista Personal. También se resuelve el problema de &#8220;ícono muerto&#8221; en el escritorio tras ejecutar Ceibal-Chess, el cual prevenía que la Actividad pudiera iniciarse dos veces consecutivas.</p>
<p><strong>Internacionalización</strong></p>
<p>Ceibal-Chess soporta ahora internacionalización de Strings y la nueva versión se distribuye con soporte para los idiomas Español e Inglés. Contribuciones para otros idiomas serán bienvenidas, si alguien se encuentra interesado.</p>
<p>Ceibal-Chess debería detectar automáticamente el idioma en el cual se encuentra la plataforma y seleccionar su propio idioma en función de dicho entorno. En caso de que un entorno no sea soportado, se revertirá a Inglés automaticamente.</p>
<p><strong>Mejoras Visuales</strong></p>
<p>Ceibal-Chess incluye un efecto de transición entre estados del tablero (mediante Alpha Blending). Este efecto requiere Pygame 1.8 o superior. En plataformas donde se dispone de Pygame 1.7, este efecto se encontrará dehabilitado y un mensaje será escrito en el Log.</p>
<p><strong>Descarga</strong></p>
<p>Pasos para XO:</p>
<ol>
<li>Remover la Actividad &#8220;Ajedrez&#8221;, si esta se encuentra instalada y reiniciar Sugar (Ctrl + Alt + Erase).</li>
<li>Iniciar la Actividad &#8220;Navegar&#8221;, dirigirse a http://www.ceibaljam.org y hacer click en &#8220;Descargas&#8221;.</li>
<li>Identificar la fila correspondiente a &#8220;Ceibal-Chess&#8221; y descargar el bundle &#8220;ajedrez.xo&#8221;. Una vez descargado, seleccionar &#8220;Abrir&#8221; en el navegador.</li>
</ol>
<p>Pasos para otras plataformas (Windows, Linux, Mac con Python y Pygame):</p>
<ol>
<li>Iniciar el navegador Web e ingresar la siguiente dirección: <a href="http://www.algorithmia.net/software/download.py?dl=ceibal-chess-beta.zip">http://www.algorithmia.net/software/download.py?dl=ceibal-chess-beta.zip</a></li>
<li>Descomprimir el zip y dirigirse al Directorio &#8220;ceibal-chess-beta3&#8243;.</li>
<li>Ejecutar el script &#8220;main.py&#8221;.</li>
</ol>
<p><strong>Reportar Errores</strong></p>
<p>Como siempre, su feedback es invaluable para corregir problemas y asegurarnos que Ceibal-Chess se encuentre en un buen estado para alcanzar la versión 1.0.</p>
<p>Para reportar errores, por favor utilizar el siguiente formulario: <a href="http://code.google.com/p/ceibal-chess/issues/list">http://code.google.com/p/ceibal-chess/issues/list</a></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/12/09/ceibal-chess-beta-3-disponible/feed/</wfw:commentRss>
		<slash:comments>2</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>Rendering de Mapas de Quake 2 &#8211; Lightmaps</title>
		<link>http://varrojo.algorithmia.net/2010/11/21/rendering-de-mapas-de-quake-2-lightmaps/</link>
		<comments>http://varrojo.algorithmia.net/2010/11/21/rendering-de-mapas-de-quake-2-lightmaps/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 20:12:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Quake]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1108</guid>
		<description><![CDATA[Este fin de semana estuve trabajando de a ratitos en el soporte para Lightmaps para el renderer de mapas de Quake 2. Afortunadamente implementar los lightmaps no fue tan costoso como el soporte para el mapeo de texturas. Quake 2 &#8230; <a href="http://varrojo.algorithmia.net/2010/11/21/rendering-de-mapas-de-quake-2-lightmaps/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este fin de semana estuve trabajando de a ratitos en el soporte para Lightmaps para el renderer de mapas de Quake 2. Afortunadamente implementar los lightmaps no fue tan costoso como el soporte para el mapeo de texturas.<br />
<center><br />
<div id="attachment_1109" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_2.png"><img class="size-medium wp-image-1109" title="Base 1 Cuarto Escondido Lightmap" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_2-293x300.png" alt="Cuarto escondido en base1.bsp, renderizado con Lightmaps. " width="293" height="300" /></a><p class="wp-caption-text">Cuarto escondido en base1.bsp, renderizado con Lightmaps. </p></div><br />
</center><br />
Quake 2 permite acelerar mucho el rendering de polígonos precalculando la iluminación que afecta a cada uno en la etapa de compilación del Árbol BSP. Estos cálculos son almacenados en la forma de una textura de iluminación (Lightmap) que luego puede multiplicarse por la textura del polígono para obtener un efecto de tener sombreado y sombras en la escena, sin deber realizar el cálculo en tiempo real.</p>
<p>Quienes jugaron Quake 2 recordarán la psicodelia típica de los mapas, lo cual distingue mucho la apariencia visual del Quake 2 de la del Quake original. Esto se debe a que los Lightmaps de Quake 2 son imágenes RGB de 24 bits por pixel, permitiendo mapear no solo sombras y sombreado, sino también colores sobre los polígonos. Esto se utiliza mucho en los cuartos de exteriores, donde se quiere expresar la hostilidad de la atmósfera del planeta Strogg, y para implementar luces cromáticas.</p>
<p><center><br />
<div id="attachment_1110" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_3.png"><img class="size-medium wp-image-1110" title="Cuarto Exterior en base1, con Lightmaps" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_3-293x300.png" alt="" width="293" height="300" /></a><p class="wp-caption-text">Cuarto exterior en base1.bsp renderizado con sus Lightmaps.</p></div><br />
</center></p>
<p>A nivel de implementación el Lightmap es simplemente otra textura que debe mapearse sobre los polígonos junto con la proveniente del archivo WAL. Para combinar ambas texturas utilicé multitexturing y escribí un Shader que multiplica los texel provenientes de cada una de las dos imágenes en tiempo de ejecución.</p>
<p>Prefusionar el Lightmap con la textura difusa hubiese sido más rápido, sin embargo, esto no fue una opción dado que cada polígono tiene su propio Lightmap asociado, a diferencia de las texturas difusas, las cuales son compartidas entre varios polígonos.</p>
<p>La dificultad más grande que enfrenté para esta tarea fue calcular las coordenadas de textura del polígono en el Lightmap (las cuales son distintas de las coordenadas utilizadas para la textura difusa). Tras bastante ensayo y error, terminé encontrando la fórmula correcta en los foros de GameDev.net, <a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=538713">aquí</a>. Mil gracias al autor del post, realmente esta fórmula no se encuentra por ningún lado y buscarla en el código fuente del Quake 2 es una tarea muy tediosa.</p>
<p>Finalmente, a modo de comentario, los Lightmaps agregan muchísimo realismo al renderer, sin embargo, tienen un costo asociado. En particular, al existir un Lightmap por polígono, para un mapa de aproximadamente 9.500 polígonos (como base1.bsp), esto implica que tendremos 9.500 texturas más, aumentando un poco el consumo de memoria de video, pero -más importante- obligándonos a realizar más llamadas a glBindTexture en cada cuadro, realmente perjudicando el framerate. Existen varias estrategias para intentar resolver este problema, alguna de las cuales intentaré tras terminar de mejorar el aspecto visual de los mapas.</p>
<p>A continuación dejo algunas capturas realizadas con el renderer. Nótese el realismo agregado a la escena, sobre todo comparando con el <a href="http://varrojo.algorithmia.net/2010/11/16/redering-de-mapas-de-quake-2-texturas/">post anterior</a>, en el cual solo mapeábamos texturas. Para generar estas imágenes, modifiqué la proyección perspectiva a una más &#8220;suave&#8221;. Creo que la matriz actual es más parecida a la utilizada por el Quake 2.</p>
<p>Finalmente, notarás que el cielo sigue roto, afortunadamente tengo alguna idea para desarrollar un Shader especial para el cielo que permita renderizarlo como en el Motor original de Quake 2.</p>
<p>Hasta la próxima!</p>
<p><center><br />
<div id="attachment_1111" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_1.png"><img class="size-medium wp-image-1111" title="Cuarto final de Base1." src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_1-293x300.png" alt="Cuarto Final de base1.bsp, con el ascensor a la Installation (base2)." width="293" height="300" /></a><p class="wp-caption-text">Cuarto Final de base1.bsp, con el ascensor a la Installation (base2).</p></div></p>
<p style="text-align: center;">
<p><div id="attachment_1112" class="wp-caption aligncenter" style="width: 303px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_0.png"><img class="size-medium wp-image-1112" title="Cuarto de inicio en Base1" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/base1_lm_0-293x300.png" alt="" width="293" height="300" /></a><p class="wp-caption-text">Cuarto de inicio en base1.bsp. Notar que el cielo no se renderiza bien debido a que no dispone (aún) de su propio shader.</p></div><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/11/21/rendering-de-mapas-de-quake-2-lightmaps/feed/</wfw:commentRss>
		<slash:comments>0</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>Lua CheatSheet</title>
		<link>http://varrojo.algorithmia.net/2010/11/13/lua-cheatsheet/</link>
		<comments>http://varrojo.algorithmia.net/2010/11/13/lua-cheatsheet/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 15:32:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1083</guid>
		<description><![CDATA[Desde hace algún tiempo he estado considerando la posibilidad de aprender Lua, un lenguaje de programación desarrollado en Brasil muy popular para implementar motores de scripting en juegos. Casualmente me encontré hace algunos días esta CheatSheet que llegaba a la &#8230; <a href="http://varrojo.algorithmia.net/2010/11/13/lua-cheatsheet/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Desde hace algún tiempo he estado considerando la posibilidad de aprender Lua, un lenguaje de programación desarrollado en Brasil muy popular para implementar motores de scripting en juegos.</p>
<p>Casualmente me encontré hace algunos días esta CheatSheet que llegaba a la portada del Programming Reddit.<br />
<center><br />
<div id="attachment_1084" class="wp-caption aligncenter" style="width: 209px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/lua_cheat_sheet.png"><img class="size-medium wp-image-1084" title="Lua CheatSheet" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/11/lua_cheat_sheet-199x300.png" alt="" width="199" height="300" /></a><p class="wp-caption-text">Lua CheatSheet - Lua es un lenguaje muy parecido a Python!</p></div><br />
</center></p>
<p>Me pareció un excelente recurso para rápidamente hacerse con una buena impresión del lenguaje. ¡Muchas gracias al autor en <a href="http://coffeeghost.net/2010/11/01/lua-cheat-sheet-for-programmers/">CoffeeGhost</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/11/13/lua-cheatsheet/feed/</wfw:commentRss>
		<slash:comments>0</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>Filosoraptor se pregunta&#8230;</title>
		<link>http://varrojo.algorithmia.net/2010/10/29/filosoraptor-se-pregunta/</link>
		<comments>http://varrojo.algorithmia.net/2010/10/29/filosoraptor-se-pregunta/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 17:53:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1063</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><center><br />
<a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/10/Philosoraptor-Why-are-threads-called-threads-If-there-arent-any-strings-involved.jpg"><img class="aligncenter size-full wp-image-1064" title="Philosoraptor - Threads" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/10/Philosoraptor-Why-are-threads-called-threads-If-there-arent-any-strings-involved.jpg" alt="" width="400" height="400" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/10/29/filosoraptor-se-pregunta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C: How To Program @ Google Books</title>
		<link>http://varrojo.algorithmia.net/2010/10/25/c-how-to-program/</link>
		<comments>http://varrojo.algorithmia.net/2010/10/25/c-how-to-program/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 15:38:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1054</guid>
		<description><![CDATA[Encontré el libro completo &#8220;C: How To Program&#8221; de Deitel &#038; Deitel en Google Books. Por suerte Google Books provee una forma fácil de embeberlo en un iframe. Lo dejo a continuación.]]></description>
			<content:encoded><![CDATA[<p>Encontré el libro completo &#8220;C: How To Program&#8221; de Deitel &#038; Deitel en Google Books.</p>
<p>Por suerte Google Books provee una forma fácil de embeberlo en un iframe. Lo dejo a continuación.</p>
<p><iframe frameborder="0" scrolling="no" style="border:0px" src="http://books.google.com/books?id=3tvRMQEq2f4C&#038;lpg=PP1&#038;dq=c%3A%20how%20to%20program&#038;pg=PP1&#038;output=embed" width=500 height=500></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/10/25/c-how-to-program/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

