<?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>Luanatic with features &#187; OpenGL</title>
	<atom:link href="http://www.pplux.com/category/opengl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pplux.com</link>
	<description>PpluX &#039;s blog</description>
	<lastBuildDate>Mon, 11 May 2009 08:21:00 +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>gpu gems 2: online !</title>
		<link>http://www.pplux.com/2008/05/13/gpu-gems-2-online/</link>
		<comments>http://www.pplux.com/2008/05/13/gpu-gems-2-online/#comments</comments>
		<pubDate>Tue, 13 May 2008 08:50:22 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Libros]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[gpu]]></category>
		<category><![CDATA[nvidia]]></category>

		<guid isPermaLink="false">http://www.pplux.com/?p=169</guid>
		<description><![CDATA[No sé para qué me gasto el dinero, pero me alegro de que Nvidia esté &#8220;liberando&#8221; los gpu gems. No están todos, cada semana tres capítulos nuevos, así nadie se atraganta Relacionadas: gpu gems online]]></description>
			<content:encoded><![CDATA[<p>No sé para qué me gasto el dinero, pero me alegro de que Nvidia esté <a href="http://news.developer.nvidia.com/2008/05/gpu-gems-2---on.html">&#8220;liberando&#8221; los gpu gems</a>. </p>
<p>No están todos, cada semana tres capítulos nuevos, así nadie se atraganta <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Relacionadas: <a href="http://www.pplux.com/2008/03/26/gpu-gems-publicado-online/">gpu gems online</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/05/13/gpu-gems-2-online/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Seminarios de la Breakpoint&#8217;08</title>
		<link>http://www.pplux.com/2008/04/11/seminarios-de-la-breakpoint08/</link>
		<comments>http://www.pplux.com/2008/04/11/seminarios-de-la-breakpoint08/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 10:31:30 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[DemoScene]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2008/04/11/seminarios-de-la-breakpoint08/</guid>
		<description><![CDATA[Las Breakpoint&#8217;s siempre dejan demos espectaculares pero, personalmente, lo que más me fascina de la party son la calidad de algunos de sus seminarios. Se molestan en organizarlos, grabarlos y dejarlos online para disfrute de todo el mundo. A mi me han gustado especialmente, sin ningún orden específico: Multi-threading made easier through Open-Source Threading Building [...]]]></description>
			<content:encoded><![CDATA[<p>Las <a href="http://breakpoint.untergrund.net/">Breakpoint&#8217;s</a> siempre dejan <a href="http://www.pouet.net/party.php?which=450&#038;when=2008">demos</a> espectaculares pero, personalmente, lo que más me fascina de la party son la calidad de algunos de sus <a href="http://breakpoint.untergrund.net/seminars.php">seminarios</a>. Se molestan en organizarlos, grabarlos y dejarlos <a href="http://breakpoint.untergrund.net/seminars.php">online</a> para disfrute de todo el mundo.</p>
<p>A mi me han gustado especialmente, sin ningún orden específico:<br />
<span id="more-159"></span><br />
<a href="http://breakpoint.untergrund.net/download.php?dir=2008/seminars/&#038;file=BP08_Seminar_Aaron_Coday.mp4"><strong>Multi-threading made easier through Open-Source Threading Building Blocks</strong></a></p>
<div class="alignCenter"><img src="/files/BP08-tbb.png" alt="BreakPoint'08 TBB" /></div>
<blockquote><p>Task stealing: cuando un core real se queda sin tareas &#8220;roba&#8221; a otro una tarea para maximizar el <a href="http://es.wikipedia.org/wiki/Throughput">throughput</a> </p></blockquote>
<p>Después de hacer una extensa introducción sobre paralelismo, paralelismo sobre datos, paralelismo funcional, etc&#8230; muy orientado a videojuegos (bien!) nos presenta <a href="http://threadingbuildingblocks.org/">Threading Building Blocks</a>(TBB), una librería brutal, open-source y multiplataforma,  de la mano de intel. </p>
<p>La parte novedosa de usar TBB es que está orientado a tareas (task patterns), no a programar threads (hilos) como tal. Programar tareas hace que, teóricamente, el diseño escale automáticamente según el número de cores que tenga nuestro procesador. TBB es para C++, y está hecho para C++, por lo que usa plantillas para definir concurrent-containers (hash, queue, vector, ..), algoritmos paralelos (sort, for, while, reduce, &#8230;), tiene también un patrón &#8220;pipeline&#8221; para poder encadenar tareas, scalable-memory-allocators (para evitar sincronizaciones entre tareas al reservar memoria), etc.</p>
<p>Otra razón para usar tareas es que es fácil debuggear, ya que por diseño, puedes limitar todo a un single thread y depurar, una vez todo funciona puedes lanzarlo en multithread con casi todas las garantías de que va a funcionar.</p>
<p>En general TBB está <strong>muy</strong> bien montado. No se si se nota las ganas que tengo de usarlo <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://breakpoint.untergrund.net/download.php?dir=2008/seminars/&#038;file=BP08_Seminar_Bonzaj.mp4"><br />
<strong>To hardcode or not &#8211; considerations about an ultimate demotool</strong></a></p>
<div class="alignCenter"><img src="/files/BP08-plastic.png" alt="BreakPoint'08 Plastic" /></div>
<blockquote><p> Motor de render picoEngine, integrado dentro de Maya como plugin. Escena de la última demo de <a href="http://www.plastic-demo.org/">plastic</a>: <a href="http://www.pouet.net/prod.php?which=50170">Linger in Shadows</a>  </p></blockquote>
<p>¿ hardcodear demos ó demotools ? Evolución de <a href="http://www.plastic-demo.org/">plastic</a> desde sus primeras demos hardcodeadas a los plugins y editores que ahora usan para diseñar demos. Por lo visto tienen su motor de render  (picoEngine) integrado como un plugin del editor que usen (Maya en este caso), y un editor de escenas para ajustar timelines, velocidad, etc. </p>
<p>Definitivamente para plastic el enfoque está muy cerca del artista, aunque reconocen que cierta funcionalidad es más cómoda de implementar en código que diseñarla con un editor.</p>
<p><a href="http://breakpoint.untergrund.net/download.php?dir=2008/seminars/&#038;file=BP08_Seminar_Navis.mp4"><br />
<strong>Tonite let&#8217;s all make demo in Bingen</strong></a></p>
<div class="alignCenter"><img src="/files/BP08-asd.png" alt="BreakPoint'08 ASD" /></div>
<blockquote><p> La demo cuenta una historia, tiene un flujo y los efectos de transición, no son tales, si no que se integran en ese flujo conectando una escena con la siguiente, suavemente. </p></blockquote>
<p>Vemos la otra cara de la moneda, para <a href="http://www.asd.gr/">ASD</a> lo principal es el código como herramienta y defienden que muchos de los efectos y transiciones no se podrían hacer con comodidad en un demoeditor. Por otro lado, como con plastic, no todo es blanco o negro.</p>
<p>Empieza con las razones por las que no hacemos demos ( me ha gustado eso de : &#8220;19% estamos intimidados por Farbrausch&#8221; ) y cómo las hacen en ASD. Básicamente: librería sencillita en C++, soporte básico para manejo de shaders y texturas, sin engine para animaciones, sistemas de partículas adecuados, scripting para los eventos y funciones de cámara imaginativas.</p>
<p>Desmitifican el &#8220;hacer una hardcoded demo es más difícil&#8221; y explican paso a paso como organizan sus demos. Detallan cómo organizan las escenas, efectos y las transiciones (aunque las transiciones de ASD son para dar de comer aparte).</p>
<p>Del motor de partículas destacan que es una pérdida de tiempo el típico bucle de actualización de partícula por frame, ya que en el 95% de los casos, las partículas se comportan de forma determinista por lo que se puede calcular su path previamente.</p>
<p>También es interesante cómo ajustan los detalles de las escenas, utilizando rands, y semillas asociadas a eventos de teclado y ratón para encontrar algún estado que quede bien en la demo (mola!!!).</p>
<p>Las cámaras tienen solo un par de movimientos, elípticos y lineales, interpolados con <a href="http://en.wikipedia.org/wiki/Sigmoid_function">s-curves</a>, simple y controlable.</p>
<p>El resto es filosofía de diseño, muy, muy interesante.</p>
<p><a href="http://breakpoint.untergrund.net/download.php?dir=2008/seminars/&#038;file=BP08_Seminar_Yury_Uralsky_Smoke.mp4"><strong>When there&#8217;s smoke there&#8217;s fire</strong></a></p>
<div class="alignCenter"><img src="/files/BP08-nvidia.png" alt="BreakPoint'08 Nvidia" /></div>
<blockquote><p> ¡¡ Ruido, y más ruido !!  </p></blockquote>
<p>Una presentación de nvidia muy asequible para el público en general sobre generación procedural y cálculo en la GPU. Explica con muchísimo detalle <a href=" http://en.wikipedia.org/wiki/Perlin_noise">perlin noise</a> para modelado de partículas, al margen del uso que hagan la explicación por si sola ya merece la pena.</p>
<p>Después continúa con la evolución del perlin noise hacia el <a href="http://en.wikipedia.org/wiki/Simplex_noise">Simplex noise</a> y cómo usarlo, acabando con notas sobre el sampleado del ruido para conseguir los mejores resultados.</p>
<p>La segunda parte de la charla trata sobre cómo renderizar humo. Empieza por la composición del humo en la escena (esta es la parte fácil y similar con la primera parte de la charla). Después comenta cómo calcular la simulación de fluidos en la GPU y añade cómo  detectar las colisiones con geometría de la escena (pasándola a un volumen).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/04/11/seminarios-de-la-breakpoint08/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GPU gems, publicado online.</title>
		<link>http://www.pplux.com/2008/03/26/gpu-gems-publicado-online/</link>
		<comments>http://www.pplux.com/2008/03/26/gpu-gems-publicado-online/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 21:59:40 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Libros]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2008/03/26/gpu-gems-publicado-online/</guid>
		<description><![CDATA[Nvidia ha dejado disponible online la primera entrega del GPU gems.Un gesto nada despreciable teniendo en cuenta lo caros que llegan a ser este tipo de libros. La serie GPU gems se compone de artículos independientes que analizan problemas muy particulares. Son amenos de leer y no se centran únicamente en los gráficos, también exploran [...]]]></description>
			<content:encoded><![CDATA[<p><img class="floatRight" src="/files/gpu_gems_cover.png" alt="GPU gems cover" /><br />
<a href="http://news.developer.nvidia.com/2008/03/gpu-gems---now.html">Nvidia</a> ha dejado disponible online la primera entrega del <a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part01.html">GPU gems</a>.Un gesto nada despreciable teniendo en cuenta lo caros que llegan a ser este tipo de libros.</p>
<p>La serie GPU gems se compone de artículos independientes que analizan problemas muy particulares. Son amenos de leer y no se centran únicamente en los gráficos, también exploran otros usos de la GPU o cuestiones de diseño muy prácticas para los programadores que estén trasteando con motores de render .</p>
<p>En esta entrega encontraremos:</p>
<ul>
<li><a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part01.html">Efectos naturales</a></li>
<li><a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part02.html">Iluminación y sombras</a></li>
<li><a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part03.html">Materiales</a></li>
<li><a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part04.html">Procesado de Imágenes</a></li>
<li><a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part05.html">Rendimiento y Diseño</a></li>
<li><a href="http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_part06.html">Cálculo general en la GPU</></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2008/03/26/gpu-gems-publicado-online/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mañana clase de Shaders.</title>
		<link>http://www.pplux.com/2007/05/09/manana-clase-de-shaders/</link>
		<comments>http://www.pplux.com/2007/05/09/manana-clase-de-shaders/#comments</comments>
		<pubDate>Wed, 09 May 2007 18:12:05 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2007/05/09/manana-clase-de-shaders/</guid>
		<description><![CDATA[Mañana me toca presentar en una horita GLSL para una asignatura del master. Todo aquel que lo desee está invitado a venir a las 9:00 ( sí, a esa hora las calles ya están puestas ) en el seminario 2S02 del DSIC. A las 12:00 tendremos luego una sesión práctica, a la que quien quiera, [...]]]></description>
			<content:encoded><![CDATA[<p>Mañana me toca presentar en una horita <a href="http://en.wikipedia.org/wiki/GLSL">GLSL</a> para una asignatura del master. Todo aquel que lo desee está invitado a venir a las 9:00 ( sí, a esa hora las calles ya están puestas ) en el seminario 2S02 del DSIC. A las 12:00 tendremos luego una sesión práctica, a la que quien quiera, también puede venir.</p>
<p>Mientras tanto&#8230; voy a acabar la presentación <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><b>Update:</b> Aquí está la presentación por si a alguien le sirve de algo:<br />
<center><a href="/files/shaders_presentacion.pdf"><img src="/files/shaders_presentacion.png" alt="presentacion" /></a></center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2007/05/09/manana-clase-de-shaders/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bajar las &#8220;OpenGL 2.0 Man pages&#8221;</title>
		<link>http://www.pplux.com/2007/02/28/bajar-las-opengl-20-man-pages/</link>
		<comments>http://www.pplux.com/2007/02/28/bajar-las-opengl-20-man-pages/#comments</comments>
		<pubDate>Wed, 28 Feb 2007 18:54:22 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2007/02/28/bajar-las-opengl-20-man-pages/</guid>
		<description><![CDATA[Recientemente ha aparecido una nueva sección en la página de OpengL OpenGL/SDK. Sin duda la parte más interesante son las páginas de referencia de las funciones de openGL, &#8220;OpenGL 2.1 Reference Pages&#8220;, aunque no están para descargar siempre se puede tirar de wget para crearnos una copia local, concretamente la linea mágica es: wget -p [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente ha aparecido una nueva sección en la página de OpengL <a href="http://www.opengl.org/sdk">OpenGL/SDK</a>. Sin duda la parte más interesante son las páginas de referencia de las funciones de openGL, &#8220;<a href="http://www.opengl.org/sdk/docs/man/">OpenGL 2.1 Reference Pages</a>&#8220;, aunque no están para descargar siempre se puede tirar de wget para crearnos una copia local, concretamente la linea mágica es:<br />
<code><br />
wget -p -nH -k -np -r -Popengl2 --cut-dirs=3 --html-extension http://www.opengl.org/sdk/docs/man/<br />
</code></p>
<p>Aunque aun faltarán tres documentos que wget no descubre que hace falta bajar <img src='http://www.pplux.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
<code><br />
cd opengl2/xhtml<br />
wget http://www.opengl.org/sdk/docs/man/xhtml/pmathml.xsl<br />
wget http://www.opengl.org/sdk/docs/man/xhtml/ctop.xsl<br />
wget http://www.opengl.org/sdk/docs/man/xhtml/mathml.xsl<br />
</code></p>
<p>PD: También podría dejar colgado un tgz con todo, pero no estoy seguro de si es legal o no, de esta forma cada uno se lo hace por su cuenta y riesgo. Realmente lo interesante es que quien no haya usado wget para hacer un mirror de una página por lo menos ya sabe que se puede. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2007/02/28/bajar-las-opengl-20-man-pages/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cargar texturas con ImageMagick</title>
		<link>http://www.pplux.com/2007/02/07/cargar-texturas-con-imagemagick/</link>
		<comments>http://www.pplux.com/2007/02/07/cargar-texturas-con-imagemagick/#comments</comments>
		<pubDate>Wed, 07 Feb 2007 12:12:49 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[recetas]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2007/02/07/cargar-texturas-con-imagemagick/</guid>
		<description><![CDATA[Cargar texturas en OpenGL implica leer una textura, crear un objeto de textura y subir los texels a la gráfica. Los dos últimos pasos, el de crear y subir la información, no son complicados o por lo menos siempre se hacen igual, pero leer una imagen de disco suele ser un quebradero de cabeza si [...]]]></description>
			<content:encoded><![CDATA[<p>Cargar texturas en OpenGL implica leer una textura, crear un objeto de textura y subir los <a href="http://en.wikipedia.org/wiki/Texel_%28graphics%29">texels</a> a la gráfica. Los dos últimos pasos, el de crear y subir la información, no son complicados o por lo menos siempre se hacen igual, pero leer una imagen de disco suele ser un quebradero de cabeza si pretendemos hacerlo a mano. Claro está, no me refiero a leer de disco a secas, me refiero a leer imágenes con formato ya sea jpg, png, svg, etc.</p>
<p>Típicamente en el mundillo de los gráficos desde tiempos inmemoriales se ha venido usando un set de librerías conocido por <a href="http://openil.sourceforge.net/">DevIL</a> ( que inicialmente se llamaba OpenIL  aunque por problemas con SGI cambiaron el nombre). Esta librería es además de práctica muy sencilla de utilizar y entona muy bien con openGL por estar basada en una máquina de estados y estar separada en varios niveles de abstracción IL, ILU, ILUT (como GL, GLU, y GLUT). </p>
<p>Pero si queremos usar algo más potente de DevIL podemos usar <a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>. Con ImageMagick ganaremos no sólo un cargador, además ganamos un editor, compositor y conversor de imágenes con la ventaja de que ImageMagick probablemente ya viene instalada en las ubuntu/debian/*nix normales ( y si no viene, sólo hay que enseñar a usar <a href="http://www.imagemagick.org/script/convert.php">convert</a> o cualquiera de las <a href="http://www.imagemagick.org/script/command-line-tools.php">command-line-tools</a> de ImageMagick ).</p>
<p>Veamos un breve, rapidísimo tutorial de cómo cargar una imagen con Imagemagick. Vamos a usar la interfaz &#8220;C&#8221; de magick-wand, también existe una para C++ (así como para python, perl, php,&#8230;) pero implicaría tener que añadir una dependencia extra&#8230; y la verdad es que Magick-Wand es suficientemente fácil de usar por sí misma. </p>
<p><code><br />
<font color="#ff40ff">#include </font><font color="#ff6060">&lt;wand/magick_wand.h&gt;</font><br />
<font color="#00ff00">int</font> main(...) {<br />
    MagickWandGenesis();<br />
    MagickWand *wand = NewMagickWand();<br />
    <font color="#8080ff">// ...</font><br />
    wand = DestroyMagickWand(wand);<br />
    MagickWandTerminus();<br />
}<br />
</code></p>
<p>Las llamadas MagickWandGenesis y MagickWandTerminus inicializan y finalizan la librería, una vez hecho con NewMagickWand y DestroyMagickWand podemos crear y liberar varitas (mágicas) para trabajar con imágenes, transformalas, etc&#8230; Lo siguiente consiste en cargar la imagen de un fichero o un <a href="http://en.wikipedia.org/wiki/Binary_large_object">BLOB</a> de memoria:</p>
<p><code><br />
        <font color="#8080ff">// opcion 1: leer de fichero dado un path</font><br />
        MagickBooleanType status = MagickReadImage ( wand, path );<br />
        <font color="#8080ff">// opcion 2: leer de un puntero a memoria (data) de tamaño conocido (size)</font><br />
        MagickBooleanType status = MagickReadImageBlob( wand, data, size );<br />
        <font color="#ffff00">if</font> ( status != MagickFalse )<br />
        {<br />
        }<br />
</code></p>
<p>Las dos llamadas de MagickReadImage[Blob] hacen lo mismo, leen una imagen y además lo hacen identificando el tipo de imagen que es. Esto lo digo concretamente por la versión &#8220;blob&#8221;, no hay que decirle si es un png, jpg, ppm, svg&#8230; Imagemagick lo identificará por la cabecera del fichero, si usáis vuestro propio cargador de ficheros no tenéis más que leer el fichero entero sin preocuparos del tipo de fichero y MagickReadImageBlob intentará leerlo.<br />
También existe la versión MagickReadImageFile que recibe un descriptor de fichero tipo FILE*<br />
<b>nota:</b> en vuestro caso particular sólo hay que usar una de las dos opciones, claro está <img src='http://www.pplux.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>El resultado es un booleano, si todo a ido bien sólo queda recuperar esa información y subirlo a la textura. En este caso vamos a tener en cuenta si la imagen tiene alfa o no (para ImageMagick es ver si tiene opacidad):</p>
<p><code><br />
        <font color="#00ff00">unsigned</font> <font color="#00ff00">long</font> width = MagickGetImageWidth( wand );<br />
        <font color="#00ff00">unsigned</font> <font color="#00ff00">long</font> height = MagickGetImageHeight( wand );<br />
        <font color="#00ff00">unsigned</font> <font color="#00ff00">char</font> *data = <font color="#ff6060">0</font>;<br />
        MagickFlipImage( wand );<br />
        <font color="#8080ff">// reservamos para una textura y la activamos</font><br />
        glGenTextures(<font color="#ff6060">1</font>, &amp;texture);<br />
        glBindTexture(GL_TEXTURE_2D, texture);<br />
        <font color="#ffff00">if</font> ( MagickGetImageChannelDepth(wand, OpacityChannel) &gt; <font color="#ff6060">1</font> )<br />
        {<br />
            <font color="#8080ff">// con alfa</font><br />
            data = <font color="#ffff00">new</font> <font color="#00ff00">unsigned</font> <font color="#00ff00">char</font>[width*height*<font color="#ff6060">4</font>];<br />
            MagickGetImagePixels(wand, <font color="#ff6060">0</font>,<font color="#ff6060">0</font>, width, height, <font color="#ff6060">&quot;RGBA&quot;</font>, CharPixel, data);<br />
            glTexImage2D(GL_TEXTURE_2D, <font color="#ff6060">0</font>, GL_RGBA, width, height, <font color="#ff6060">0</font>, GL_RGBA, GL_UNSIGNED_BYTE, data);<br />
        }<br />
        <font color="#ffff00">else</font><br />
        {<br />
            <font color="#8080ff">// sin alfa</font><br />
            data = <font color="#ffff00">new</font> <font color="#00ff00">unsigned</font> <font color="#00ff00">char</font>[width*height*<font color="#ff6060">3</font>];<br />
            MagickGetImagePixels(wand, <font color="#ff6060">0</font>,<font color="#ff6060">0</font>, width, height, <font color="#ff6060">&quot;RGB&quot;</font>, CharPixel, data);<br />
            glTexImage2D(GL_TEXTURE_2D, <font color="#ff6060">0</font>, GL_RGB, width, height, <font color="#ff6060">0</font>, GL_RGB, GL_UNSIGNED_BYTE, data);<br />
        }<br />
        <font color="#ffff00">delete</font>[] data;<br />
</code></p>
<p>Este ya es un buen cacho, primero obtenemos ancho y alto de la imagen, hacemos un flip de la imagen (ya que en OpenGL las imágenes empiezan abajo a la izquierda &#8211; <a href="http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/">pitfall 12</a>) y reservamos una textura de OpenGL. Después preguntamos a la varita si la imagen tiene alfa, en realidad le preguntamos si la profundidad del canal de opacidad es mayor que 1, si es así reservamos espacio para guardarnos la información de la imagen en formato RGBA y lo subimos a la textura. Si no tiene alfa pues lo mismo pero en formato RGB. Y como somos muy limpios, al final un delete[] para liberar la memoria temporal donde guardamos la imagen.</p>
<p>Y finalmente el ejemplo más o menos completo del tema&#8230; Para compilarlo en linux no hay que olvidar que tenemos un <em>mágico</em> <code> `Wand-config --cppflags --cflags --ldflags --libs`</code> para ayudarnos.</p>
<p><code><br />
<font color="#ff40ff">#include </font><font color="#ff6060">&lt;GL/gl.h&gt;</font><br />
<font color="#ff40ff">#include</font><font color="#ff6060">&lt;wand/magick_wand.h&gt;</font><br />
<font color="#00ff00">int</font> main(...) {<br />
    <font color="#8080ff">// inicializamos openGL o lo que haga falta...</font><br />
    GLuint texture = <font color="#ff6060">0</font>; <font color="#8080ff">// nuestra textura</font><br />
    MagickWandGenesis();<br />
    MagickWand *wand = NewMagickWand();<br />
    <font color="#8080ff">// opcion 1: leer de fichero dado un path</font><br />
    MagickBooleanType status = MagickReadImage ( wand, path );<br />
    <font color="#8080ff">// opcion 2: leer de un puntero a memoria (data) de tamaño conocido (size)</font><br />
    MagickBooleanType status = MagickReadImageBlob( wand, data, size );<br />
    <font color="#ffff00">if</font> ( status != MagickFalse )<br />
    {<br />
        <font color="#00ff00">unsigned</font> <font color="#00ff00">long</font> width = MagickGetImageWidth( wand );<br />
        <font color="#00ff00">unsigned</font> <font color="#00ff00">long</font> height = MagickGetImageHeight( wand );<br />
        <font color="#00ff00">unsigned</font> <font color="#00ff00">char</font> *data = <font color="#ff6060">0</font>;<br />
        MagickFlipImage( wand );<br />
        <font color="#8080ff">// reservamos para una textura y la activamos</font><br />
        glGenTextures(<font color="#ff6060">1</font>, &amp;texture);<br />
        glBindTexture(GL_TEXTURE_2D, texture);<br />
        <font color="#ffff00">if</font> ( MagickGetImageChannelDepth(wand, OpacityChannel) &gt; <font color="#ff6060">1</font> )<br />
        {<br />
            <font color="#8080ff">// con alfa</font><br />
            data = <font color="#ffff00">new</font> <font color="#00ff00">unsigned</font> <font color="#00ff00">char</font>[width*height*<font color="#ff6060">4</font>];<br />
            MagickGetImagePixels(wand, <font color="#ff6060">0</font>,<font color="#ff6060">0</font>, width, height, <font color="#ff6060">&quot;RGBA&quot;</font>, CharPixel, data);<br />
            glTexImage2D(GL_TEXTURE_2D, <font color="#ff6060">0</font>, GL_RGBA, width, height, <font color="#ff6060">0</font>, GL_RGBA, GL_UNSIGNED_BYTE, data);<br />
        }<br />
        <font color="#ffff00">else</font><br />
        {<br />
            <font color="#8080ff">// sin alfa</font><br />
            data = <font color="#ffff00">new</font> <font color="#00ff00">unsigned</font> <font color="#00ff00">char</font>[width*height*<font color="#ff6060">3</font>];<br />
            MagickGetImagePixels(wand, <font color="#ff6060">0</font>,<font color="#ff6060">0</font>, width, height, <font color="#ff6060">&quot;RGB&quot;</font>, CharPixel, data);<br />
            glTexImage2D(GL_TEXTURE_2D, <font color="#ff6060">0</font>, GL_RGB, width, height, <font color="#ff6060">0</font>, GL_RGB, GL_UNSIGNED_BYTE, data);<br />
        }<br />
        <font color="#ffff00">delete</font>[] data;<br />
    }<br />
    wand = DestroyMagickWand(wand);<br />
    MagickWandTerminus();<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2007/02/07/cargar-texturas-con-imagemagick/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Glee con soporte para OpenGL 2.1</title>
		<link>http://www.pplux.com/2006/11/18/glee-con-soporte-para-opengl-21/</link>
		<comments>http://www.pplux.com/2006/11/18/glee-con-soporte-para-opengl-21/#comments</comments>
		<pubDate>Sat, 18 Nov 2006 09:16:32 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2006/11/18/glee-con-soporte-para-opengl-21/</guid>
		<description><![CDATA[Glee es una pequeña librería multiplataforma + cabecera (gl.h) que permite programar siempre con la última versión de la especificación de OpenGL, en este caso la versión 2.1. Glee cargará por ti dinámicamente aquellas extensiones que soporte tu tarjeta, sólo hay que tener en cuenta que aunque estés progrmando contra el API de OpenGL 2.1, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://elf-stone.com/glee.php">Glee</a> es una pequeña librería multiplataforma + cabecera (gl.h) que permite programar siempre con la última versión de la especificación de OpenGL, en este caso la versión 2.1. </p>
<p>Glee cargará por ti dinámicamente aquellas extensiones que soporte tu tarjeta, sólo hay que tener en cuenta que aunque estés progrmando contra el API de OpenGL 2.1, es posible que tu tarjeta <b>NO</b> soporte ciertas llamadas, o ciertos formatos&#8230; las comprobaciones de las <em>capabilities</em> de la tarjeta se tienen que seguir haciendo ( en tiempo de ejecución ).</p>
<p>En resumen, el que prueba esta librería no vuelve a complicarse la vida con las <a href="http://www.opengl.org/resources/features/OGLextensions/">extesiones de OpenGL</a>.</p>
<p>Desde: <a href="http://www.opengl.org/news/permalink/glee_opengl_extension_library_adds_support_for_opengl_21_and_geforce_8_open/">OpenGL.org</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2006/11/18/glee-con-soporte-para-opengl-21/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programando bien en OpenGL</title>
		<link>http://www.pplux.com/2006/11/12/programando-bien-en-opengl/</link>
		<comments>http://www.pplux.com/2006/11/12/programando-bien-en-opengl/#comments</comments>
		<pubDate>Sun, 12 Nov 2006 14:49:03 +0000</pubDate>
		<dc:creator>PpluX</dc:creator>
				<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://www.pplux.com/2006/11/12/programando-bien-en-opengl/</guid>
		<description><![CDATA[Que un programa escrito en OpenGL hace diez años compile hoy día puede decir dos cosas: o bien que OpenGL es fenomenal y su diseño ha permitido crecer de forma monótona (siempre incrementando su api y nunca dejando algo deprecated) sin consecuencias o por el contrario OpenGL es compatible hacia atrás pero usar un estilo [...]]]></description>
			<content:encoded><![CDATA[<p>Que un programa escrito en OpenGL hace diez años compile hoy día puede decir dos cosas: o bien que OpenGL es fenomenal y  su diseño ha permitido crecer de forma monótona (siempre incrementando su api y nunca dejando algo <em>deprecated</em>) sin consecuencias o por el contrario OpenGL es compatible hacia atrás pero usar un estilo de programación de hace diez años tiene consecuencias. </p>
<p>La respuesta es: tiene consecuencias (y graves). ¿Cómo hacer que OpenGL vaya mucho más deprisa? para averiguarlo podéis ver este <a href="http://video.google.de/videoplay?docid=847205086747563852&#038;q=Blender+Conference+2006">video</a> de la última Blender Conference. Este video nos viene a contar desde qué punto de vista hemos de enfocar el uso de OpenGL hoy día, ya que el hecho de poder programar como hace 10 años no justifica el hacerlo teniendo en cuenta la penalización que eso supone. </p>
<p>Me ha gustado tanto que intentaré desglosar su contenido en pequeños posts, por si alguien tiene dificultades con el inglés.<br />
Noticia original <a href="http://www.opengl.org/news/permalink/video_presentation_from_the_blender_conference_06_opengl_performance_progra/">OpenGL performance programming</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pplux.com/2006/11/12/programando-bien-en-opengl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

