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

<channel>
	<title>Varrojo@Linux &#187; OpenGL</title>
	<atom:link href="http://varrojo.algorithmia.net/category/opengl/feed/" rel="self" type="application/rss+xml" />
	<link>http://varrojo.algorithmia.net</link>
	<description>A master calls it a butterfly, even though a caterpillar calls it death.</description>
	<lastBuildDate>Thu, 09 Sep 2010 15:58:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Grupo Khronos anuncia OpenGL 4.1</title>
		<link>http://varrojo.algorithmia.net/2010/07/27/khronos-anuncia-opengl-4-1/</link>
		<comments>http://varrojo.algorithmia.net/2010/07/27/khronos-anuncia-opengl-4-1/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 17:46:05 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[OpenGL]]></category>

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

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=893</guid>
		<description><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/>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 la tarjeta de video del dispositivo para calcular y desplegar los conjuntos de Julia-Fatou y [...]]]></description>
			<content:encoded><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/><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>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F07%2F09%2Fios-hackathon%2F&amp;linkname=Algorithmia%20en%20el%20iOS%20Hackathon"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/07/09/ios-hackathon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Animación Interpolada para Modelos de Quake 2</title>
		<link>http://varrojo.algorithmia.net/2010/06/27/animacion-interpolada-para-modelos-de-quake-2/</link>
		<comments>http://varrojo.algorithmia.net/2010/06/27/animacion-interpolada-para-modelos-de-quake-2/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 21:27:12 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>

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

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

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=607</guid>
		<description><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/>Ayer me encontré con este dibujo: Este dibujo muestra visualmente las llamadas a OpenGL versión 3.3 para dibujar geometría en la pantalla. Puede resultar una buena referencia para recordar las diferencias entre las distintas invocaciones para dibujar mediante Vertex Arrays. En el dibujo se encuentran ausentes todas las llamadas correspondientes al rendering mediante Modo Inmediato [...]]]></description>
			<content:encoded><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/><p>Ayer me encontré con este dibujo:</p>
<p><center><br />
<div id="attachment_608" class="wp-caption aligncenter" style="width: 223px"><a href="http://varrojo.algorithmia.net/wp-content/uploads/2010/03/opengl-draw-calls.png"><img class="size-medium wp-image-608" title="Llamadas para Dibujar de OpenGL 3.3" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/03/opengl-draw-calls-213x300.png" alt="Llamadas para Dibujar de OpenGL 3.3" width="213" height="300" /></a><p class="wp-caption-text">Dibujando con OpenGL 3.3</p></div><br />
</center></p>
<p>Este dibujo muestra visualmente las llamadas a OpenGL versión 3.3 para dibujar geometría en la pantalla. Puede resultar una buena referencia para recordar las diferencias entre las distintas invocaciones para dibujar mediante Vertex Arrays.</p>
<p>En el dibujo se encuentran ausentes todas las llamadas correspondientes al rendering mediante Modo Inmediato y Dispay Lists, las cuales fueron marcadas como obsoletas a partir de OpenGL 3.2.</p>
<p>Visto en: <a href="http://tartley.com/?p=1045">http://tartley.com/?p=1045</a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F03%2F23%2Fvistazo-a-la-api-de-opengl-para-dibujar%2F&amp;linkname=Vistazo%20a%20la%20API%20de%20OpenGL%20para%20Dibujar"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/03/23/vistazo-a-la-api-de-opengl-para-dibujar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12 años de portabilidad</title>
		<link>http://varrojo.algorithmia.net/2010/01/18/12-anos-de-portabilidad/</link>
		<comments>http://varrojo.algorithmia.net/2010/01/18/12-anos-de-portabilidad/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 14:36:40 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Free & Open]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=530</guid>
		<description><![CDATA[<br/>Esta mañana leía un artículo en un blog llamado &#8220;Insight VR&#8221; muy interesante. El artículo cuenta la historia de una aplicación estilo &#8220;Asteroids&#8221; desarrollada hace 12 años por un -en aquel momento- estudiante de Computer Science. Según cuenta, la aplicación se desarrolló utilizando Mesa, una implementación libre de OpenGL, como un trabajo obligatorio. En un [...]]]></description>
			<content:encoded><![CDATA[<br/><p>Esta mañana leía un artículo en un blog llamado &#8220;Insight VR&#8221; muy interesante. El artículo cuenta la historia de una aplicación estilo &#8220;Asteroids&#8221; desarrollada hace 12 años por un -en aquel momento- estudiante de Computer Science.</p>
<p>Según cuenta, la aplicación se desarrolló utilizando Mesa, una implementación libre de OpenGL, como un trabajo obligatorio.</p>
<p>En un principio, la aplicación se desarrolló sobre un Mac, al poco tiempo se portó a una Workstation SGI (debiendo reescribir únicamente las rutinas de entrada del usuario). A los años, ésta se portó a Windows y, más recientemente, al iPhone.</p>
<p>La historia es muy interesante y termina con una conclusión bastante importante. El autor destaca como el hecho de haber trabajado con un estándar abierto (OpenGL) permitió que su programa pudiera mantenerse vigente y sobreviviera la prueba del tiempo.</p>
<blockquote><p>&#8220;Imagina si en vez de OpenGL (ok, Mesa3D) hubiesemos usado alguna versión temprana de Direct3D para mi clase de gráficos. No solo todo lo que escribí se hubiese vuelto obsoleto cinco veces a esta altura, sino que ¿en qué plataformas funcionaría? &#8220;</p></blockquote>
<p>El autor concluye,</p>
<blockquote><p>&#8220;Realmente hay algo para decir a favor de los estándares abiertos y las bibliotecas construídas sobre dichos estándares. [...] Si estás escribiendo algo que va a tener una vida útil más allá de un par de años, deberías considerar cuidadosamente las tecnologías de base que utilizarás para construirlo. No te distraigas con los términos marketineros o lo que esté de moda. Incluso si lo que estás escribiendo es código para descartar, escribirlo portable puede brindar oportunidades que de otra forma no existirían.&#8221;</p></blockquote>
<p>Realmente algo para considerar.</p>
<p>Les dejo el <a href="http://blog.insightvr.com/?p=209">link al artículo</a> (en inglés).</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F01%2F18%2F12-anos-de-portabilidad%2F&amp;linkname=12%20a%C3%B1os%20de%20portabilidad"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/01/18/12-anos-de-portabilidad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Trabajando con PyOpenGL y VBOs</title>
		<link>http://varrojo.algorithmia.net/2010/01/15/trabajando-con-pyopengl-y-vbos/</link>
		<comments>http://varrojo.algorithmia.net/2010/01/15/trabajando-con-pyopengl-y-vbos/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 17:36:08 +0000</pubDate>
		<dc:creator>Varrojo</dc:creator>
				<category><![CDATA[Computación Gráfica]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://varrojo.algorithmia.net/?p=511</guid>
		<description><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/>En estos últimos días he estado trabajando sobre un renderer para un artículo que estoy produciendo para una importante revista de Linux. El renderer debía dibujar un campo de vectores discretizado, con dimensiones variables de 16&#215;16, 32&#215;32, 64&#215;64 y hasta 96&#215;96 (o más, dependiendo de la cantidad de memoria de video disponible). Cada elemento en [...]]]></description>
			<content:encoded><![CDATA[<img src="http://varrojo.algorithmia.net/wp-content/uploads/2010/05/kscreensaver.png" width="64" height="64" alt="" title="Computación Gráfica" /><br/><p>En estos últimos días he estado trabajando sobre un renderer para un artículo que estoy produciendo para una importante revista de Linux. El renderer debía dibujar un campo de vectores discretizado, con dimensiones variables de 16&#215;16, 32&#215;32, 64&#215;64 y hasta 96&#215;96 (o más, dependiendo de la cantidad de memoria de video disponible).</p>
<p>Cada elemento en el campo de vectores es representado visualmente por un cuadrado (piensa en una baldoza) y una flecha (que representa la dirección). Cada cuadrado se forma con dos triángulos y cada flecha con tres, por lo cual para un campo de vectores de tan solo 16&#215;16 estaríamos dibujando 1.280 triángulos, mientras que para un campo más grande de 64&#215;64 estaríamos trabajando con un total de 20.480 triángulos.<br />
<center><br />
<div id="attachment_513" class="wp-caption aligncenter" style="width: 108px"><a href=" http://pyopengl.sourceforge.net"><img class="size-full wp-image-513" title="PyOpenGL" src="http://varrojo.algorithmia.net/wp-content/uploads/2010/01/pyopengl.gif" alt="PyOpenGL Logo" width="98" height="128" /></a><p class="wp-caption-text">Logo de PyOpenGL</p></div><br />
</center><br />
Desarrollando en Python y utilizando PyOpenGL 3.0 en Modo Inmediato, rápidamente se podía notar como la API literalmente se ahogaba con el grán volumen de triángulos a dibujar. Es por esto por lo cual decidí reimplementar el código de rendering usando Vertex Buffer Objects (VBO&#8217;s) de OpenGL.</p>
<p>La diferencia en desempeño fue increible. Con un mediano trabajo de refactoring logré obtener una aceleración que permitía redibujar la escena mucho más rápido, tanto más que no me alcanza el refresh rate del monitor para dibujar todos los cuadros que son generados por segundo.</p>
<p>Convertir el código de rendering de Modo Inmediato de OpenGL a VBO&#8217;s no fue tarea sencilla sin embargo. El problema fundamental consistió en que para trabajar con VBO&#8217;s se deben realizar transferencias de porciones de memoria RAM a buffers en memoria de video, por lo cual es necesario realizar un manejo bastante importante de punteros. Manejar punteros no es problema desde un lenguaje como C o C++, pero se puede llegar a complicar cuando se está trabajando en Python.</p>
<p>El primer problema consistía en convertir las listas de vertices y colores de listas Python a arrays contínuos en memoria. Para esto (y mucho a mi pesar) debí utilizar <em>NumPy.array</em>, lo cual solucionó el problema, pero al costo de agregar una nueva dependencia al código: numpy. Lo bueno es que teniendo un NumPy array, resulta sencillo generar los tipos adecuados para que los datos lleguen correctamente a la memoria de video. El siguiente snippet muestra la llamada a la función de copia de memoria:</p>
<pre class="brush:python">from OpenGL.GL import *
from OpenGL.arrays import ArrayDatatype as ADT
import numpy
...
array = numpy.array(vertices_and_colors, dtype=numpy.float32)
glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(array), ADT.voidDataPointer(array), GL_STATIC_DRAW)</pre>
<p>El segundo problema que tuve consitió en cómo indicarle a PyOpenGL los offsets dentro del buffer. El buffer de memoria que estoy utilizando está cargado tanto con datos de vértices como de colores, por lo cual debía poder especificar dónde empiezan los vértices y dónde empiezan los colores (en offset de bytes) a la API. Si bien esto parecía sencillo utilizando ctypes, se complicó bastante debido a un bug en PyOpenGL 3.0. La solución fué descargar el código de la Beta de PyOpenGL 3.0.1, compilarlo y hacer uso de ésta biblioteca en vez de la versión disponible en los repositorios de Ubuntu y Macports (actualmente ambas presentan este bug).</p>
<p>Una vez actualizada la biblioteca, crear un puntero genérico (void *) resultó trivial, como se muestra a continuación.</p>
<pre class="brush:python">from ctypes import c_void_p
...
glColorPointer(3, GL_FLOAT, 0, c_void_p(colors_offset))</pre>
<p>Quiero mencionar que cuando escribí en la lista de usuarios de PyOpenGL preguntando por este último problema, quien me respondió que en realidad se trataba de un bug en la biblioteca no fué ni más ni menos que el autor de la misma (!)</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fvarrojo.algorithmia.net%2F2010%2F01%2F15%2Ftrabajando-con-pyopengl-y-vbos%2F&amp;linkname=Trabajando%20con%20PyOpenGL%20y%20VBOs"><img src="http://varrojo.algorithmia.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://varrojo.algorithmia.net/2010/01/15/trabajando-con-pyopengl-y-vbos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
