<?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; Computación Gráfica</title>
	<atom:link href="http://varrojo.algorithmia.net/category/computacion-grafica/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>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>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>Mythbusters: CPU vs GPU</title>
		<link>http://varrojo.algorithmia.net/2010/09/15/mythbusters-cpu-vs-gpu/</link>
		<comments>http://varrojo.algorithmia.net/2010/09/15/mythbusters-cpu-vs-gpu/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 23:03:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=1001</guid>
		<description><![CDATA[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 &#8217;08. El video es un poco largo (casi &#8230; <a href="http://varrojo.algorithmia.net/2010/09/15/mythbusters-cpu-vs-gpu/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>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 &#8217;08.</p>
<p><center><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/XtGf0HaW7x4?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/XtGf0HaW7x4?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
</center></p>
<p>El video es un poco largo (casi 10 minutos), pero es muy entretenido y explica la diferencia en forma muy visual y muy clara.</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/09/15/mythbusters-cpu-vs-gpu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Papers Técnicos en SIGGRAPH 2010</title>
		<link>http://varrojo.algorithmia.net/2010/07/29/papers-tecnicos-en-siggraph-2010/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/29/papers-tecnicos-en-siggraph-2010/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 17:53:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computación Gráfica]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=930</guid>
		<description><![CDATA[El siguiente video presenta un resumen de los papers técnicos que están siendo presentados esta semana en la Conferencia SIGGRAPH 2010, en Los Angeles. Realmente muy impresionante.]]></description>
			<content:encoded><![CDATA[<p>El siguiente video presenta un resumen de los papers técnicos que están siendo presentados esta semana en la Conferencia <a href="http://www.siggraph.org/s2010/">SIGGRAPH 2010</a>, en Los Angeles. Realmente muy impresionante.</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/-PMf3XrwPKo&#038;color1=0xb1b1b1&#038;color2=0xd0d0d0&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/-PMf3XrwPKo&#038;color1=0xb1b1b1&#038;color2=0xd0d0d0&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/29/papers-tecnicos-en-siggraph-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shortcuts de Blender</title>
		<link>http://varrojo.algorithmia.net/2010/07/15/shortcuts-de-blender/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/15/shortcuts-de-blender/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 15:20:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blender]]></category>
		<category><![CDATA[Computación Gráfica]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=912</guid>
		<description><![CDATA[En estos días he aprendiendo a usar Blender (www.blender.org), un software increíblemente enorme que permite desde hacer sencillos modelos 3D hasta películas. Blender es Software Libre (y además gratis), por lo cual es muy sencillo de instalar. En Fedora simplemente &#8230; <a href="http://varrojo.algorithmia.net/2010/07/15/shortcuts-de-blender/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En estos días he aprendiendo a usar Blender (<a href="http://www.blender.org">www.blender.org</a>), un software increíblemente enorme que permite desde hacer sencillos modelos 3D hasta películas.</p>
<p>Blender es Software Libre (y además gratis), por lo cual es muy sencillo de instalar. En Fedora simplemente se puede utilizar <strong>yum</strong>.</p>
<p>Lo primero que van a notar en Blender es que la interfaz de usuario tiene muchísimos controles. En parte por esto, cuando comencé a utilizarlo, noté que la interacción con el programa era lenta. No lenta por el Software en sí, sino que me sentía que la forma en que la interfaz me permitía expresar mis acciones era lenta.</p>
<p>Resulta que, si bien Blender está diseñado para ser utilizado con un Mouse de 3 botones, si no se saca provecho de los atajos (Shortcuts) del teclado, uno pasa mucho tiempo teniendo que revisar montones de controles (y quizás moviéndose entre varias solapas).</p>
<p>Tras mirar algunos videos en YouTube y leer algunos artículos, armé la siguiente lista de atajos comunes. Tomarme un momento para aprenderlos (y al principio teniéndola presente al usar el programa) puede aumentar nuestra velocidad de interacción con la interfaz significativamente.</p>
<p>Veamos algunos atajos comunes.</p>
<p><strong>Blender &#8211; Atajos Comunes para Control de Cámara:<br />
</strong></p>
<ol>
<li>0 : Vista de cámara (camera view).</li>
<li>3 : Vista de costado (side view).</li>
<li>7 : Vista desde arriba (top view).</li>
<li>5 : Cambiar la proyección (perspectiva &lt;-&gt; paralela).</li>
<li>F12 : Renderizar escena desde la posición de la cámara.</li>
<li>alt + click botón izquierdo : rotación libre de cámara (ver nota [1] debajo).</li>
<li>ctrl + alt + click botón izquierdo : zoom hacia adentro y hacia afuera (ver nota [1] debajo).</li>
</ol>
<p><strong>Blender &#8211; Atajos Comunes para controlar Objetos:</strong></p>
<ol>
<li>click botón izquierdo: establecer centro de rotación y escalado (ver nota [2] debajo).</li>
<li>click botón derecho: seleccionar un objeto o vértice.</li>
<li>g: &#8220;grab tool&#8221; &#8211; toma un objeto y permite moverlo.</li>
<li>s: &#8220;size tool&#8221; &#8211; permite ajustar el tamaño de un objeto (¡esto es distinto a ajustar la Escala!).</li>
<li>r: &#8220;rotate tool&#8221; &#8211; permite rotar el objeto seleccionado respecto del centro especificado.</li>
<li>x: borrar el objeto seleccionado.</li>
<li>shift + d: duplicar el objeto seleccionado.</li>
<li>b: seleccionar.</li>
<li>ctrl + j: &#8220;join objects&#8221; &#8211; permite &#8220;unir&#8221; objetos para manipularlos como uno solo.</li>
<li>barra espaciadora: abrir menú de objetos (permite agregar nuevos objetos).</li>
<li>A : ver el objeto seleccionado como una malla de triángulos (luego podremos seleccionar sus vértices individuales con click derecho).</li>
</ol>
<p>Notas:</p>
<ol>
<li>Algunos manejadores de ventanas capturan la combinación (alt + click izquierdo) y la utilizan para permitir controlar la posición de la ventana. Este es el caso de GNOME, por ejemplo. En estos casos puede engañarse al manejador de ventanas para que ignore la combinación presionando también la tecla &#8220;súper&#8221; (también conocida como &#8220;Windows Logo&#8221;).</li>
<li>Para algunas operaciones (tal como la rotación de objetos) se puede especificar el centro. En el caso puntual de la rotación, esto permite realizar rotaciones tanto sobre el centro mismo del objeto como sobre un punto arbitrario del espacio.</li>
</ol>
<p>Una vez hechos sus modelos, Blender les permite exportarlos en formato VRML (<strong>.obj</strong>), el cual es muy sencillo de cargar y dibujar en su propio renderer : )</p>
<p>Les dejo un link a algunos tutoriales en blender.org: <a href="http://www.blender.org/education-help/tutorials/">http://www.blender.org/education-help/tutorials/</a></p>
<p>Happy Blending!</p>
]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/15/shortcuts-de-blender/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>
	</channel>
</rss>

