<?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>int main</title>
	<atom:link href="http://blog.r2d2rigo.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.r2d2rigo.es</link>
	<description></description>
	<lastBuildDate>Wed, 21 Sep 2011 18:18:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Soluciones de TuentiContest en C#</title>
		<link>http://blog.r2d2rigo.es/2011/06/21/soluciones-de-tuenticontest-en-c/</link>
		<comments>http://blog.r2d2rigo.es/2011/06/21/soluciones-de-tuenticontest-en-c/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 22:49:51 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[TuentiContest]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/blog/2011/06/21/soluciones-de-tuenticontest-en-c/</guid>
		<description><![CDATA[La semana pasada participé en la 1ª competición de programación Tuenti, y aunque las pruebas eran amenas y relativamente fáciles de completar, perdí el ritmo y lo acabé abandonando. He publicado en CodePlex las soluciones a los problemas 1 a &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2011/06/21/soluciones-de-tuenticontest-en-c/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>La semana pasada participé en la <a href="https://contest.tuenti.net/" target="_blank">1ª competición de programación Tuenti</a>, y aunque las pruebas eran amenas y relativamente fáciles de completar, perdí el ritmo y lo acabé abandonando. He publicado en CodePlex las <a href="http://intmain.codeplex.com/SourceControl/changeset/view/90340" target="_blank">soluciones a los problemas 1 a 6</a>, programadas con C# y .NET 4.0, por si le son útiles a alguien o simplemente quiere ver otros puntos de vista para resolver los primeros problemas. Intentaré documentarlas o comentarlas mínimamente en los próximos días <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blog.r2d2rigo.es/files/2011/06/wlEmoticon-smile.png" alt="Sonrisa" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2011/06/21/soluciones-de-tuenticontest-en-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Curso “Desarrollo de aplicaciones para móviles con .NET”</title>
		<link>http://blog.r2d2rigo.es/2011/05/25/curso-desarrollo-de-aplicaciones-para-mviles-con-net/</link>
		<comments>http://blog.r2d2rigo.es/2011/05/25/curso-desarrollo-de-aplicaciones-para-mviles-con-net/#comments</comments>
		<pubDate>Wed, 25 May 2011 22:17:27 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/blog/2011/05/25/curso-desarrollo-de-aplicaciones-para-mviles-con-net/</guid>
		<description><![CDATA[Del 25 al 28 de julio voy a impartir junto con Andrés Pérez un curso de desarrollo para Windows Phone 7 en la Sede Universitaria de La Nucía de la Universidad de Alicante. El curso será supervisado por Fernando Llopis, &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2011/05/25/curso-desarrollo-de-aplicaciones-para-mviles-con-net/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Del 25 al 28 de julio voy a impartir junto con <a href="http://aperezgil.blogspot.com/" target="_blank">Andrés Pérez</a> un curso de desarrollo para Windows Phone 7 en la Sede Universitaria de La Nucía de la Universidad de Alicante. El curso será supervisado por Fernando Llopis, Director de la Escuela Politécnica superior, que además impartirá los bloques de introducción a C#.</p>
<p>El temario se centrará en el desarrollo de juegos con XNA, tanto en 2D como en 3D, dividido en 8 horas de C#, 5 de programación 2D y 7 de programación 3D, además de 10 horas no presenciales para la realización de un proyecto de evaluación (el curso es convalidable por 2 créditos de libre elección). Si quieres más información o inscribirte, visita <a href="http://web.ua.es/es/seus/cursos-verano/la-nucia/cursos-de-verano/desarrollo-de-aplicaciones-para-moviles-con-net.html" target="_blank">este</a> enlace.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2011/05/25/curso-desarrollo-de-aplicaciones-para-mviles-con-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GamePad to KeyBoard lanzado</title>
		<link>http://blog.r2d2rigo.es/2010/05/07/gamepad-to-keyboard-lanzado/</link>
		<comments>http://blog.r2d2rigo.es/2010/05/07/gamepad-to-keyboard-lanzado/#comments</comments>
		<pubDate>Fri, 07 May 2010 19:39:47 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[codeplex]]></category>
		<category><![CDATA[GP2KB]]></category>
		<category><![CDATA[MIT]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/programacion/gamepad-to-keyboard-lanzado/</guid>
		<description><![CDATA[Tras un tiempo de silencio (forzado, por desgracia), he sacado algo de tiempo para empezar un pequeño proyecto: GP2KB. Se trata de un pequeño programa bajo licencia MIT con el que podrás transformar la entrada de tu controlador de XBox &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2010/05/07/gamepad-to-keyboard-lanzado/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Tras un tiempo de silencio (forzado, por desgracia), he sacado algo de tiempo para empezar un pequeño proyecto: GP2KB. Se trata de un pequeño programa bajo licencia MIT con el que podrás transformar la entrada de tu controlador de XBox 360 en acciones de teclado; de esta manera, podrás usar el mando para jugar a juegos sin soporte nativo (emuladores, oldware, juegos Flash…).</p>
<p>El proyecto está alojado en <a href="http://gp2kb.codeplex.com/">CodePlex</a>, tanto el código fuente como el ejecutable. Es necesario tener instalados el <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=333325fd-ae52-4e35-b531-508d977d32a6&amp;displaylang=en">.NET Framework 3.5</a> y el <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53867a2a-e249-4560-8011-98eb3e799ef2&amp;displaylang=en">XNA Framework 3.1 redistributable</a> para ejecutarlo. Happy gaming!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2010/05/07/gamepad-to-keyboard-lanzado/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reviviendo XNAnimation</title>
		<link>http://blog.r2d2rigo.es/2010/02/07/reviviendo-xnanimation/</link>
		<comments>http://blog.r2d2rigo.es/2010/02/07/reviviendo-xnanimation/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 15:12:54 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/programacion/reviviendo-xnanimation/</guid>
		<description><![CDATA[Pues sí, finalmente he retomado el desarrollo de la librería de animación XNAnimation. De momento he subido un pequeño parche con los archivos de proyecto convertidos a VS2008/XNA 3.1 y algunas funciones básicas añadidas. Las próximas versiones estarán centradas en &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2010/02/07/reviviendo-xnanimation/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Pues sí, finalmente he retomado el desarrollo de la librería de animación <a href="http://xnanimation.codeplex.com/">XNAnimation.</a> De momento he subido un pequeño parche con los archivos de proyecto convertidos a VS2008/XNA 3.1 y algunas funciones básicas añadidas. Las próximas versiones estarán centradas en la corrección de bugs/errores, y a partir de ahí, añadiré nuevas funcionalidades (¡se admiten sugerencias!).</p>
<p>Gracias a <a href="http://brunoevangelista.com/">Bruno Evangelista</a>, el desarrollador original, por cederme los permisos del proyecto en CodePlex para que me pudiese hacer cargo. Espero estar a tu nivel <img src='http://blog.r2d2rigo.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2010/02/07/reviviendo-xnanimation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XNAnimation para XNA 3.1</title>
		<link>http://blog.r2d2rigo.es/2010/01/29/xnanimation-para-xna-3-1/</link>
		<comments>http://blog.r2d2rigo.es/2010/01/29/xnanimation-para-xna-3-1/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 03:00:40 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[codeplex]]></category>
		<category><![CDATA[XNA 3.1]]></category>
		<category><![CDATA[XNAnimation]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/programacion/xnanimation-para-xna-3-1/</guid>
		<description><![CDATA[Actualización rápida: acabo de colgar la librería XNAnimation 0.7.0.0 Beta 2 compilada para su uso en XNA 3.1; la versión de CodePlex, aparte de estar un poco inactiva, aún tiene los archivos de solución y de proyecto configurados para XNA &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2010/01/29/xnanimation-para-xna-3-1/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Actualización rápida: acabo de colgar la librería <a href="http://www.r2d2rigo.es/xna/XNAnimation_0.7.0.0_3.1.zip">XNAnimation 0.7.0.0 Beta 2</a> compilada para su uso en XNA 3.1; la versión de <a href="http://xnanimation.codeplex.com/">CodePlex</a>, aparte de estar un poco inactiva, aún tiene los archivos de solución y de proyecto configurados para XNA 3.0, lo que puede dar más de un quebradero de cabeza si intentas usar los archivos descargados desde allí directamente en tu juego.</p>
<p>Una lástima que una librería tan útil y potente como esta lleve parada tanto tiempo… va siendo hora que alguien retome su desarrollo, ¿no? <img src='http://blog.r2d2rigo.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2010/01/29/xnanimation-para-xna-3-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nos vamos de rebajas a… Juguetilandia</title>
		<link>http://blog.r2d2rigo.es/2010/01/21/nos-vamos-de-rebajas-a-juguetilandia/</link>
		<comments>http://blog.r2d2rigo.es/2010/01/21/nos-vamos-de-rebajas-a-juguetilandia/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 21:48:19 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Frikismo]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[commandos]]></category>
		<category><![CDATA[F.E.A.R.]]></category>
		<category><![CDATA[gunman chronicles]]></category>
		<category><![CDATA[juguetilandia]]></category>
		<category><![CDATA[no one lives forever]]></category>
		<category><![CDATA[sam & max]]></category>
		<category><![CDATA[tribes]]></category>
		<category><![CDATA[tribes 2]]></category>
		<category><![CDATA[tribes vengeance]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/frikismo/nos-vamos-de-rebajas-a-juguetilandia/</guid>
		<description><![CDATA[Entre hoy y anteayer, a la salida de ambos exámenes, me he dado una vuelta por la sección de videojuegos del Juguetilandia del centro comercial cercano a la universidad. ¿El resultado? Lo que viene a continuación… Sam &#38; Max hit &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2010/01/21/nos-vamos-de-rebajas-a-juguetilandia/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Entre hoy y anteayer, a la salida de ambos exámenes, me he dado una vuelta por la sección de videojuegos del Juguetilandia del centro comercial cercano a la universidad. ¿El resultado? Lo que viene a continuación…</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/22012010291.jpg"><img style="border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/22012010291_thumb1.jpg" alt="22012010291" width="644" height="484" border="0" /></a><br />
<em>Sam &amp; Max hit the road, No one lives forever 2, Tribes 2</em></p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/220120102921.jpg"><img style="border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/22012010292_thumb1.jpg" alt="22012010292" border="0" /></a><br />
<em>Tribes vengeance, F.E.A.R. extraction point, Commandos strike force</em></p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/220120102931.jpg"><img style="border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/22012010293_thumb1.jpg" alt="22012010293" border="0" /></a><br />
<em>Tribes, Gunman chronicles (¡el último que quedaba! casi se lo he quitado de las manos a <a href="http://twitter.com/blaxend">Edu</a>)</em></p>
<p>Si os dais una vuelta… lo siento, casi todo lo bueno ya me lo he llevado yo <img src='http://blog.r2d2rigo.es/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2010/01/21/nos-vamos-de-rebajas-a-juguetilandia/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XNA Demos (IV): reduciendo la carga del Pixel Shader con un Z-Prepass</title>
		<link>http://blog.r2d2rigo.es/2010/01/13/xna-demos-iv-reduciendo-la-carga-del-pixel-shader-con-un-z-prepass/</link>
		<comments>http://blog.r2d2rigo.es/2010/01/13/xna-demos-iv-reduciendo-la-carga-del-pixel-shader-con-un-z-prepass/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 18:18:28 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Shaders]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[Z-Prepass]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/programacion/xna-demos-iv-reduciendo-la-carga-del-pixel-shader-con-un-z-prepass/</guid>
		<description><![CDATA[Si el ejemplo anterior trataba sobre la complejidad geométrica de una escena, en éste se va a explicar un método para reducir el trabajo que tiene que realizar el raster a la hora de aplicar los Pixel Shaders. Normalmente, el &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2010/01/13/xna-demos-iv-reduciendo-la-carga-del-pixel-shader-con-un-z-prepass/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.r2d2rigo.es/xna/demos/ZPrepass.zip"><img style="border-style: initial; border-color: initial; border-width: 0px; margin: 10px;" src="http://blog.r2d2rigo.es/files/2010/01/descargar_codigo21.png" alt="descargar_codigo" align="left" border="0" /></a></p>
<p>Si el ejemplo anterior trataba sobre la complejidad geométrica de una escena, en éste se va a explicar un método para reducir el trabajo que tiene que realizar el raster a la hora de aplicar los Pixel Shaders.</p>
<p>Normalmente, el bucle de dibujado de una escena consiste en recorrer todos los objetos (si son completamente opacos no hace falta ordenarlos de más lejano a más cercano) y ejecutar las instrucciones de dibujado de cada uno. La GPU recibe todos los datos, descompone las formas complejas (rectángulos, triangle strips, triangle fans) en triángulos sencillos y ejecuta los siguientes pasos por cada uno:</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/diagrama_raster1.png"><img style="margin-left: auto; margin-right: auto; border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/diagrama_raster_thumb1.png" alt="diagrama_raster" border="0" /></a><em>Proceso de raster, simplificado.</em></p>
<p>Por lo tanto, en el mismo momento en que se determina que un triángulo o vértice es visible (pasar el Z-Test), se procede a actualizar su profundidad en el <a href="http://en.wikipedia.org/wiki/Z-buffering">Z-Buffer</a> (sobrescribiendo los valores antiguos) y se rasterizan todos los píxeles afectados por la nueva geometría.</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/depth1.png"><img style="margin-left: auto; margin-right: auto; border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/depth_thumb1.png" alt="depth" border="0" /></a><em>Z-Buffer (también llamado Depth Buffer) con la profundidad de la escena.</em></p>
<p>Pero esta implementación, aunque es completamente correcta y lógica, tiene un punto débil: en una escena ordenada de más lejano a más cercano (o, si no lo está, también pueden darse las condiciones necesarias desde determinada posición y ángulo), cada objeto dibujado superpone al anterior; de esta manera, todos los objetos pasarán el Z-Test y serán enviados al raster. Si los Pixel Shader de los objetos tienen un número elevado de instrucciones, se estará desaprovechando una buena parte del trabajo de la GPU en dibujar píxeles que más tarde serán ocluidos; para evitar esta pérdida de rendimiento, vamos a implementar una técnica llamada Z-Prepass.</p>
<p>El Z-Prepass es un algoritmo muy sencillo, en el que se dibuja toda la escena dos veces; aún teniendo el doble de coste geométrico, el ahorro de trabajo en los Pixel Shader suele compensar ésta desventaja. Los pasos a seguir son los siguientes:</p>
<ol>
<li><span style="text-decoration: underline;">Paso previo:</span>
<ol>
<li>Activar el Z-Test (<strong>RenderState.DepthBufferEnable = true</strong>).</li>
</ol>
</li>
<li><span style="text-decoration: underline;">Z-Prepass:</span>
<ol>
<li>Activar escritura en Depth Buffer (<strong>RenderState.DepthBufferWriteEnable = true</strong>).</li>
<li>Desactivar escritura en canales de color (<strong>RenderState.ColorWriteChannels = ColorWriteChannels.None)</strong>.</li>
<li>Dibujar escena con el shader de Z-Prepass.</li>
</ol>
</li>
<li><span style="text-decoration: underline;">Escena final:</span>
<ol>
<li>Reactivar escritura en canales de color (<strong>RenderState.ColorWriteChannels = ColorWriteChannels.All</strong>).</li>
<li>Desactivar escritura en Depth Buffer (<strong>RenderState.DepthBufferWriteEnable = false</strong>).</li>
<li>Dibujar escena con los shaders correspondientes.</li>
</ol>
</li>
</ol>
<p>Los cambios de estado de <strong>ColorWriteChannels</strong> no son explícitamente obligatorios, pero ayudan a ganar algo de rendimiento; debido a que la única funcionalidad que nos interesa del shader especial de Z-Prepass es la transformación de los vértices y que la GPU rellene el Depth Buffer, no nos importa descartar la información de color pues no le vamos a dar utilidad ninguna.</p>
<p>Así pues, contando con un Z-Buffer pregenerado, en el segundo pase de geometría, y al estar desactivada la escritura (sólo se comprueban los valores), sólo se rasterizan los píxeles estrictamente visibles, evitando el redibujado de partes ocultas. Además, existe hardware (como la XBOX 360 y algunos modelos de tarjetas gráficas) optimizado para ejecutar un Z-Prepass con la mayor eficiencia posible.</p>
<p>Por último, queda aclarar que el Z-Prepass no es la panacea ni una solución universal; su mayor ventaja es aplicarlo a escenas en las que el trabajo de los Pixel Shaders puede ralentizar el proceso de render en general, debido a que ejecutan un gran número de instrucciones (normal mapping, <a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=457909&amp;forum_id=10&amp;gforum_id=0">übershader</a>, sombras con <a href="http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf">PCF</a>). En los peores casos se puede llegar incluso a perder rendimiento, debido a que el coste de dibujar la geometría dos veces es mayor que el de rasterizar toda la escena.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2010/01/13/xna-demos-iv-reduciendo-la-carga-del-pixel-shader-con-un-z-prepass/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XNA Demos (III): Simulación de geometría con impostores</title>
		<link>http://blog.r2d2rigo.es/2010/01/08/xna-demos-iii-simulacin-de-geometra-con-impostores/</link>
		<comments>http://blog.r2d2rigo.es/2010/01/08/xna-demos-iii-simulacin-de-geometra-con-impostores/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 18:29:26 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Shaders]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[impostores]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/programacion/xna-demos-iii-simulacin-de-geometra-con-impostores/</guid>
		<description><![CDATA[Aunque hoy en día las GPUs ganan rendimiento a pasos agigantados, la evolución de los gráficos por computador (no olvidemos que muchos de los efectos y técnicas que ahora se usan en tiempo real estaban limitados a un uso precalculado &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2010/01/08/xna-demos-iii-simulacin-de-geometra-con-impostores/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.r2d2rigo.es/xna/demos/Imposters.zip"><img style="border-style: initial; border-color: initial; border-width: 0px; margin: 10px;" src="http://blog.r2d2rigo.es/files/2010/01/descargar_codigo1.png" alt="descargar_codigo" align="left" border="0" /></a></p>
<p>Aunque hoy en día las GPUs ganan rendimiento a pasos agigantados, la evolución de los gráficos por computador (no olvidemos que muchos de los efectos y técnicas que ahora se usan en tiempo real estaban limitados a un uso precalculado hasta no hace mucho) se adapta a estos cambios y los explota al máximo, y más aún desde el abandono de la <a href="http://nexe.gamedev.net/directknowledge/default.asp?p=Fixed%20Function%20Pipeline">FFP</a> y el advenimiento de los shaders.</p>
<p>Una de las limitaciones que más rápidamente se alcanza es la complejidad poligonal de la escena. Teniendo en cuenta que la GPU tiene que transformar la posición de cada vértice a coordenadas de pantalla, interpolar los valores (posición, normal, coordenadas de textura) al resto del triángulo, y por último rasterizar los fragmentos visibles (aplicando los efectos de shader correspondientes), tener una escena de un millón de polígonos y querer moverla con un refresco decente (60+ Hz) sigue siendo un suicidio. Por ello, hay que recurrir a técnicas de simplificación, como puede ser el <a href="http://en.wikipedia.org/wiki/Frustum_culling">frustrum culling</a>, para eliminar objetos fuera del campo de visión de la cámara, o, como se muestra en el ejemplo, simplificar el dibujado de los mismos.</p>
<p>Uno de los métodos más empleados es el <a href="http://en.wikipedia.org/wiki/Level_of_detail">Level-Of-Detail</a>, o LOD. Ésta técnica consiste en disponer de varias copias de un mismo modelo, en las que se ha ido reduciendo el nivel de polígonos (mediante un programa de modelado) progresivamente. Dependiendo de la distancia del objeto a la cámara, se dibuja una versión con mayor o menor detalle, procurando que el tamaño final del objeto en pantalla compense los posibles errores del modelo (partes deformadas, texturas mal alineadas, etc.).</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/comparacion_lod1.png"><img style="margin-left: auto; margin-right: auto; border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/comparacion_lod_thumb1.png" alt="comparacion_lod" border="0" /></a></p>
<p><em>Izquierda: ~10000 polígonos. Derecha: ~4000 polígonos.</em></p>
<p>Pero cuando el LOD no es suficiente (cientos o miles de instancias de objetos al mismo tiempo) y el <a href="http://creators.xna.com/es-ES/sample/meshinstancing">mesh instancing</a> tampoco da buenos resultados, se recurre a un “truco”: los impostores. Un impostor es un sprite orientado <strong>siempre</strong> hacia la cámara (algunas veces con un eje de rotación restringido, para evitar resultados poco realistas debido a deformaciones), y que contiene una imagen del modelo visto desde un ángulo determinado.</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/tira1.png"><img style="margin-left: auto; margin-right: auto; border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/tira_thumb1.png" alt="tira" border="0" /></a><br />
<em>Los sprites usados para los impostores del ejemplo.</em></p>
<p>Dependiendo de la forma y uso de los impostores, podremos generar más o menos proyecciones del model, dependiendo del grado de realismo que queramos alcanzar. En el ejemplo se han generado 8 vistas de 128&#215;128 píxeles, con una diferencia de 45º de rotación entre ellas; dependiendo de la orientación de la cámara, se dibujará una u otra para simular la existencia de un objeto tridimensional en la escena, como muestra el esquema siguiente:</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/diagrama1.png"><img style="margin-left: auto; margin-right: auto; border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/diagrama_thumb1.png" alt="diagrama" border="0" /></a><br />
<em>Sprite empleado dependiendo de la orientación de la cámara y el objeto.</em></p>
<p>Por último, queda aclarar que los impostores no siempre son la solución; si la diferencia de altura entre el objeto y la cámara es muy grande, se puede producir (debido a la restricción de ejes en el impostor) una distorsión que arruinaría todo el realismo de la escena:</p>
<p align="center"><a href="http://blog.r2d2rigo.es/files/2010/01/image1.png"><img style="margin-left: auto; margin-right: auto; border-style: initial; border-color: initial; border-width: 0px;" src="http://blog.r2d2rigo.es/files/2010/01/image_thumb1.png" alt="image" border="0" /></a><br />
<em>Distorsión de los impostores al verlos desde un ángulo muy inclinado.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2010/01/08/xna-demos-iii-simulacin-de-geometra-con-impostores/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XNA Demos (II): Reflexiones en tiempo real con cubemaps</title>
		<link>http://blog.r2d2rigo.es/2009/12/29/xna-demos-ii-reflexiones-en-tiempo-real-con-cubemaps/</link>
		<comments>http://blog.r2d2rigo.es/2009/12/29/xna-demos-ii-reflexiones-en-tiempo-real-con-cubemaps/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 21:15:14 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Shaders]]></category>
		<category><![CDATA[XNA]]></category>
		<category><![CDATA[cubemaps]]></category>
		<category><![CDATA[hlsl]]></category>
		<category><![CDATA[reflexiones]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/general/xna-demos-ii-reflexiones-en-tiempo-real-con-cubemaps/</guid>
		<description><![CDATA[Uno de los efectos más buscados en los videojuegos desde la transición del género a las 3D ha sido la posibilidad de generar reflexiones (como espejos o superficies metálicas) de una manera realista y convincente. Debido a la poca flexibilidad &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2009/12/29/xna-demos-ii-reflexiones-en-tiempo-real-con-cubemaps/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.r2d2rigo.es/xna/demos/RealtimeCubemap.zip"><img style="border-bottom: 0px;border-left: 0px;margin: 10px;border-top: 0px;border-right: 0px" src="http://blog.r2d2rigo.es/wp-content/uploads/2009/12/descargar_codigo.png" border="0" alt="descargar_codigo" width="154" height="29" align="left" /></a>Uno de los efectos más buscados en los videojuegos desde la transición del género a las 3D ha sido la posibilidad de generar reflexiones (como espejos o superficies metálicas) de una manera realista y convincente. Debido a la poca flexibilidad del renderizado por raster (sólo se dibujan los píxeles visibles por el volumen generado a partir de las matrices de vista y proyección), siempre se ha recurrido a “trucos” para simular el efecto. Por ejemplo, los motores con geometría basada en <a href="http://en.wikipedia.org/wiki/Constructive_solid_geometry">CSG</a> aprovechan el uso de los portales para, creando una máscara mediante el uso del stencil buffer, redibujar los objetos visibles tal y como se verían reflejados.</p>
<p>Con el aumento de la potencia de las GPUs y el abaratamiento de la VRAM, se ha optado por utilizar un tipo especial de textura llamado “cubemap”, que como el nombre indica, almacena las 6 caras de un cubo. De esta manera, se puede representar todo el entorno que rodea a un punto determinado, y se pueden crear offline (con un editor gráfico, para dibujar por ejemplo un skybox que dé profundidad a la escena) o en tiempo de ejecución.</p>
<p align="center"><a href="http://blog.r2d2rigo.es/wp-content/uploads/2009/12/cubemap.png"><img style="border-right-width: 0px;float: none;border-top-width: 0px;border-bottom-width: 0px;margin-left: auto;border-left-width: 0px;margin-right: auto" src="http://blog.r2d2rigo.es/wp-content/uploads/2009/12/cubemap_thumb.png" border="0" alt="cubemap" width="772" height="132" /></a><em>Cubemap estático de la demo, reescalado</em></p>
<p>Uno de los motores que más emplean el uso de cubemaps es Source, si bien los utiliza sólo en su versión estática; al compilar un mapa, y mediante un comando especial, se ordena que se generen los cubemaps en determinados puntos designados por el diseñador. El problema de este método es que las reflexiones sólo mostrarán los objetos estáticos del mapa, así que si creamos una superficie totalmente reflectante y situamos al jugador delante suyo, no habrá cambio alguno.</p>
<p>Un método más realista es actualizar los cubemaps dinámicamente, para que reflejen todos los cambios de la escena. Sin embargo, éste método también tiene sus desventajas: hay que dibujar la escena 7 veces (una por cada cara del cubemap y otra para el resultado final), así que hay que pensar en métodos para rebajar la carga: usar sólo un cubemap dinámico al tiempo, actualizar únicamente 2 caras a cada frame…</p>
<p>Por último, la demo también incluye un efecto de refracción, con una constante de transmisión del medio de 0.66, para simular vidrio. La única diferencia entre los dos shaders es la instrucción usada para calcular el vector que se empleará para obtener el téxel del cubemap, que en un caso es <strong>reflect</strong> y en el otro <strong>refract.</strong></p>
<p align="center"><a href="http://blog.r2d2rigo.es/wp-content/uploads/2009/12/reflex_refract.png"><img style="border-right-width: 0px;float: none;border-top-width: 0px;border-bottom-width: 0px;margin-left: auto;border-left-width: 0px;margin-right: auto" src="http://blog.r2d2rigo.es/wp-content/uploads/2009/12/reflex_refract_thumb.png" border="0" alt="reflex_refract" width="604" height="451" /></a> <em>Vectores de reflexión y refracción.</em></p>
<p style="text-align: left"><strong>01/01/2010:</strong><em> </em>actualizado el código para mejorar el rendimiento del Cubemap dinámico.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2009/12/29/xna-demos-ii-reflexiones-en-tiempo-real-con-cubemaps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SetCronJob, cron jobs gratuitos para cualquier host</title>
		<link>http://blog.r2d2rigo.es/2009/12/17/setcronjob-cron-jobs-gratuitos-para-cualquier-host/</link>
		<comments>http://blog.r2d2rigo.es/2009/12/17/setcronjob-cron-jobs-gratuitos-para-cualquier-host/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 03:11:15 +0000</pubDate>
		<dc:creator>r2d2rigo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[1&1]]></category>
		<category><![CDATA[cron jobs]]></category>
		<category><![CDATA[hostinet]]></category>
		<category><![CDATA[jóvenes en red]]></category>
		<category><![CDATA[setcronjob]]></category>

		<guid isPermaLink="false">http://blog.r2d2rigo.es/programacion/setcronjob-cron-jobs-gratuitos-para-cualquier-host/</guid>
		<description><![CDATA[Una de las cosas que eché de menos al migrar la web desde Hostinet (empresa que elegí para el programa Jóvenes en Red) a 1&#38;1 fue la posibilidad de programar cron jobs en el servidor (1&#38;1 sólo ofrece el servicio &#8230;<p class="read-more"><a href="http://blog.r2d2rigo.es/2009/12/17/setcronjob-cron-jobs-gratuitos-para-cualquier-host/">Leer más &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas que eché de menos al migrar la web desde <a href="http://www.hostinet.com/">Hostinet</a> (empresa que elegí para el programa <a href="http://www.jovenesenred.es/">Jóvenes en Red</a>) a <a href="http://www.1and1.es">1&amp;1</a> fue la posibilidad de programar cron jobs en el servidor (1&amp;1 sólo ofrece el servicio en su modalidad <a href="http://alta.1and1.es/xml/order/Hosting">Business Plus</a>).</p>
<p>Ahora, casi un año después, he necesitado volver a programar una tarea periódica para un script de la web. Y buscando en internet me he topado con <a href="http://www.setcronjob.com/">SetCronJob</a>, un servicio gratuito (también con modalidad de pago) que te permite planificar cron jobs de cualquier host externo.</p>
<p>¿Las pegas de usarlo sin pagar? Muy pocas; un intervalo de 5 minutos entre ejecuciones y la caducidad de la tarea a los 3 meses (aunque renovarla es tan sencillo como volver a logear y hacer click en el botón correspondiente).</p>
<p>Para más información consultar el <a href="http://www.setcronjob.com/faq.php">FAQ</a>, y si la suscripción gratuita te parece poco, a <a href="http://www.setcronjob.com/prices.php">contratarlo</a> por unos precios muy reducidos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.r2d2rigo.es/2009/12/17/setcronjob-cron-jobs-gratuitos-para-cualquier-host/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

