<?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>Brainswitch Media</title>
	<atom:link href="http://www.brainswitch.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brainswitch.org</link>
	<description></description>
	<lastBuildDate>Wed, 18 Apr 2012 20:21:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Black particles</title>
		<link>http://www.brainswitch.org/2012/04/232/</link>
		<comments>http://www.brainswitch.org/2012/04/232/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 17:14:56 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=232</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2012/04/blackparticles3.jpg" alt="" title="blackparticles" width="1100" height="450" class="alignnone size-full wp-image-249" />

Dernière série d'images issues de mon moteur de particules. Après avoir passé plusieurs mois dessus, j'ai encore de nombreuses idées d'améliorations comme rajouter de nouvelles forces et utiliser des geometry shaders mais j'ai envie de passer à autre chose, au moins pour le moment.]]></description>
			<content:encoded><![CDATA[<p>Dernière série d&#8217;images issues de mon moteur de particules. Après avoir passé plusieurs mois dessus, j&#8217;ai encore de nombreuses idées d&#8217;améliorations comme rajouter de nouvelles forces et utiliser des geometry shaders mais j&#8217;ai envie de passer à autre chose, au moins pour le moment. Cette fois-ci plutôt que de réaliser une vidéo j&#8217;ai préféré essayer de produire des images intéressantes. Ce qui est étonnant avec les systèmes de particules c&#8217;est qu&#8217;à partir de mouvements en grande partie basés sur le hasard, il se crée de temps en temps des formes très structurées présentant même parfois des axes de symétrie. En voici une sélection que je trouve esthétiques ou étranges. D&#8217;autres images sont visibles sur <a href="http://www.flickr.com/photos/brainswitchmedia/">un compte Flikr que j&#8217;ai ouvert récemment</a>.</p>
<p><strong>300 particules et un attracteur</strong></p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black6.jpg" alt="" title="black6" width="850" height="850" class="alignnone size-full wp-image-237" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black2.jpg" alt="" title="black2" width="850" height="850" class="alignnone size-full wp-image-234" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black1.jpg" alt="" title="black1" width="850" height="850" class="alignnone size-full wp-image-233" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black7.jpg" alt="" title="black7" width="850" height="850" class="alignnone size-full wp-image-238" /></p>
<p>&nbsp;<br />
<strong>300 particules et deux attracteurs</strong></p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black3.jpg" alt="" title="black3" width="850" height="850" class="alignnone size-full wp-image-236" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black4.jpg" alt="" title="black4" width="850" height="850" class="alignnone size-full wp-image-239" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/04/black5.jpg" alt="" title="black5" width="850" height="850" class="alignnone size-full wp-image-240" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2012/04/232/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vidéos suite</title>
		<link>http://www.brainswitch.org/2012/03/videos-suite/</link>
		<comments>http://www.brainswitch.org/2012/03/videos-suite/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 20:51:49 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=204</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2012/03/videosuite.jpg" alt="" title="videosuite" width="1100" height="450" class="alignnone size-full wp-image-210" />

J'ai trouvé une méthode qui fonctionne plutôt bien pour enregistrer mes vidéos avec du son. Je commence par jouer l'animation à 60fps et je récupère dans un fichier xml, pour chaque frame, l'énergie des beats ainsi que les paramètres modifiés manuellement.]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai trouvé une méthode qui fonctionne plutôt bien pour enregistrer mes vidéos avec du son. Je commence par jouer l&#8217;animation à 60fps et je récupère dans un fichier xml, pour chaque frame, l&#8217;énergie des beats ainsi que les paramètres modifiés manuellement. Je rejoue ensuite l&#8217;animation avec les données du fichier xml et pour chaque enregistrement je génère une image que j&#8217;enregistre dans un dossier. Je peux même choisir la taille des images en faisant un rendu dans un FBO, du coup je peux aussi profiter des fonctions d&#8217;antialiasing en paramétrant le format. Je récupère ensuite les images que je monte avec After Effect en y superposant la musique.</p>
<p><strong>Electro Particles 1</strong><br />
J&#8217;ai ajouté pas mal de fonctionnalités à mon moteur de particules, je peux associer un certains nombres forces: attraction, répulsion, rotation, Perlin. Je peux aussi forcer les particules à évoluer sur une sphère et rajouter des rayons, des lignes ou des trails. J&#8217;aimerai bien maintenant pouvoir placer plusieurs forces de rotations. Je n&#8217;ai pas encore vraiment réfléchi au problème mais je pense qu&#8217;il pourrait y avoir une solution du coté des quaternions.<br />
&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/03/particles1.jpg" alt="" title="particles1" width="850" height="600" class="alignnone size-full wp-image-205" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/03/particles2.jpg" alt="" title="particles2" width="850" height="600" class="alignnone size-full wp-image-206" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/03/particles3.jpg" alt="" title="particles3" width="850" height="600" class="alignnone size-full wp-image-207" /><br />
&nbsp;<br />
La vidéo. Musique: &#8216;The Three Corners of The Earth&#8217; d&#8217;Anthony Gonzalez et Curt Morgan, Trailer &#8216;The Art of Flight&#8217;.</p>
<p><iframe src="http://player.vimeo.com/video/38603810?title=0&amp;byline=0&amp;portrait=0" width="850" height="478" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><br />
&nbsp;</p>
<p><strong>Electro Particles 2</strong><br />
Toujours avec le même moteur de particules mais avec des paramètres différents. Dans cette vidéo les particules se repoussent entre elles et sont plus ou moins attirées par 4 sphères en mouvement.<br />
&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/03/particles41.jpg" alt="" title="particles4" width="850" height="600" class="alignnone size-full wp-image-213" /></p>
<p>&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2012/03/particles5.jpg" alt="" title="particles5" width="850" height="600" class="alignnone size-full wp-image-209" /><br />
&nbsp;<br />
La vidéo. Musique: Super Flu @ Flex Vienna.</p>
<p><iframe src="http://player.vimeo.com/video/38648208?title=0&amp;byline=0&amp;portrait=0" width="850" height="478" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2012/03/videos-suite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vidéos</title>
		<link>http://www.brainswitch.org/2012/02/videos/</link>
		<comments>http://www.brainswitch.org/2012/02/videos/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 20:18:16 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=196</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2012/02/video1.jpg" alt="" title="video1" width="1100" height="450" class="alignnone size-full wp-image-197" />

J'ai enfin réussi à créer des vidéos correctes de mes animations. Auparavant je les créais avec le logiciel de capture Snapz Pro mais le résultat était décevant.]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai enfin réussi à créer des vidéos correctes de mes animations. Auparavant je les créais avec le logiciel de capture Snapz Pro mais le résultat était décevant. Snapz Pro ralentissait l&#8217;animation et la vidéo était trop saccadée. Maintenant j&#8217;enregistre une séquence d&#8217;images avec copyWindowSurface() que je monte ensuite avec After Effects. Il me reste plus qu&#8217; à trouver une méthode pour ajouter le son de l&#8217;animation à la vidéo.<br />
&nbsp;<br />
<iframe src="http://player.vimeo.com/video/37114946?title=0&amp;byline=0&amp;portrait=0" width="850" height="478" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>&nbsp;</p>
<p><iframe src="http://player.vimeo.com/video/37491963?title=0&amp;byline=0&amp;portrait=0" width="850" height="478" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2012/02/videos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Motion stripes</title>
		<link>http://www.brainswitch.org/2012/02/motion-stripes/</link>
		<comments>http://www.brainswitch.org/2012/02/motion-stripes/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 22:40:24 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=186</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2012/02/glsltripes.jpg" alt="" title="glsltripes" width="1100" height="450" class="alignnone size-full wp-image-187" />

Je commence un peu mieux à comprendre Cinder et les shaders. Voici donc le résultat de mes travaux du mois de janvier: textures procédurales audio-réactives, sphères, tubes et B-spline. ]]></description>
			<content:encoded><![CDATA[<p>Je commence à comprendre un peu mieux Cinder et les shaders. Voici le résultat de mes travaux du mois de janvier: textures procédurales audio-réactives, sphères, tubes et B-spline. Je suis épaté par les possibilités de ce framework. Si j&#8217;en ai le temps je vais essayer de faire un billet sur l&#8217;utilisation des B-splines parce que la facilité avec laquelle il est possible de créer des tubes en mouvement à l&#8217;aide du fameux parallel transport frame est tout simplement étonnante. Par contre je suis toujours incapable de sortir une vidéo de l&#8217;animation de bonne qualité.</p>
<p>Rendu final avec anti-aliasing et éclairage.</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/02/glslstripes1.jpg" alt="" title="glslstripes1" width="850" height="600" class="alignnone size-full wp-image-189" /></p>
<p>&nbsp;<br />
Rendu final avec tubes et textures.</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/02/glslstripest2.jpg" alt="" title="glslstripest2" width="850" height="600" class="alignnone size-full wp-image-190" /></p>
<p>&nbsp;<br />
Rendus final avec tubes et blending.</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/02/glslstripes3.jpg" alt="" title="glslstripes3" width="850" height="600" class="alignnone size-full wp-image-192" /></p>
<p>&nbsp;<br />
Rendu final avec textures et blending.</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/02/glslstripes4.jpg" alt="" title="glslstripes4" width="850" height="600" class="alignnone size-full wp-image-193" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2012/02/motion-stripes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Particules audio-réactives</title>
		<link>http://www.brainswitch.org/2012/01/particules-audio-reactives/</link>
		<comments>http://www.brainswitch.org/2012/01/particules-audio-reactives/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 17:47:49 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=173</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2012/01/particles.jpg" alt="" title="particles" width="1100" height="450" class="alignnone size-full wp-image-179" />


J'ai enfin terminé ma première animation audio-réactive avec Cinder. Pour le moment, OpenGL étant encore quelque chose de nouveau pour moi, j'ai surtout passé du temps à comprendre la gestion des caméras, des billboards et des fonctions de blending de base.]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai enfin terminé ma première animation audio-réactive avec Cinder. Pour le moment, OpenGL étant encore quelque chose de nouveau pour moi, j&#8217;ai surtout passé du temps à comprendre la gestion des caméras, des billboards et des fonctions de blending de base. L&#8217;animation en elle même est donc assez simple, sans shaders et sans modèles 3D. 2 groupes de particules sont attirés par un point au centre de la scène, la taille des objets et l&#8217;attraction exercée par le point central varient en fonction du rythme de la musique.<br />
&nbsp;</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/01/particles1.jpg" alt="" title="particles1" width="850" height="478" class="alignnone size-full wp-image-181" /></p>
<p>&nbsp;</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/01/particles2.jpg" alt="" title="particles2" width="850" height="478" class="alignnone size-full wp-image-182" /></p>
<p>&nbsp;</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2012/01/particles3.jpg" alt="" title="particles3" width="850" height="487" class="alignnone size-full wp-image-183" /></p>
<p>&nbsp;</p>
<p><iframe src="http://player.vimeo.com/video/37997323?title=0&amp;byline=0&amp;portrait=0" width="850" height="478" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p>Musique: Slam &#8211; Room 2 &#8211; Pan Pot Rave Tool Mix</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2012/01/particules-audio-reactives/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beat detection avec Cinder</title>
		<link>http://www.brainswitch.org/2011/11/beat-detection-avec-cinder/</link>
		<comments>http://www.brainswitch.org/2011/11/beat-detection-avec-cinder/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 17:28:40 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=160</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2011/11/Beat-detection.jpg" alt="" title="Beat detection" width="1100" height="450" class="alignnone size-full wp-image-161" />

Suite de mon exploration du framework Cinder. Pour le développement d'animations audio-réactives, j'ai commencé à réaliser la partie portant sur l'acquisition du son et la détection du tempo.]]></description>
			<content:encoded><![CDATA[<p>Suite de mon exploration du framework Cinder. Pour le développement d&#8217;animations audio-réactives, j&#8217;ai commencé par réaliser la partie portant sur l&#8217;acquisition du son et la détection du tempo. De ce coté Cinder est vraiment bien foutu et les deux exemples fournis avec le framework permettent de comprendre rapidement l&#8217;utilisation de la classe audio et ses fonctions de traitement du son comme la discrétisation du signal. J&#8217;ai remarqué un seul petit problème avec la classe audio, qui n&#8217;est pour le moment apparemment toujours pas résolu. Avec certaines cartes son il semble qu&#8217;il y ait de temps en temps des plantages au démarrage, en tout cas sur mon mac book ça arrive. Mais étant donné que ce n&#8217;est qu&#8217;au lancement de l&#8217;application que ça se produit ce n&#8217;est pas franchement rédhibitoire. Par contre pour une installation multimédia permanente avec redémarrage et extinction automatique du programme ça peut néanmoins être ennuyeux.</p>
<p>En ce qui concerne l&#8217;algorithme de détection du tempo, je me suis basé sur une source Flash très efficace: <a href="http://www.julapy.com/blog/2007/12/30/beat-detection-in-flash/">beat detection in flash</a>. Le principe est le suivant: on calcule l&#8217;énergie instantanée par frame en faisant la moyenne des énergies sur une certaine plage de fréquences et on compare la valeur avec la moyenne des dernières valeurs stockées dans une mémoire tampon. Si l&#8217;énergie instantanée est supérieure à la moyenne du tampon, on détecte un beat. A lire également, <a href="http://pierre.fritsch.free.fr/supelec/bpm/rapport_bpm.pdf" target="blank">cet article</a> très intéressant sur la détection du tempo.</p>
<p>&nbsp;</p>
<p><iframe src="http://player.vimeo.com/video/32196966?title=0&amp;byline=0&amp;portrait=0" width="850" height="563" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></p>
<p>Musique: Tractile &#8211; Silent Movie</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2011/11/beat-detection-avec-cinder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Décomposition RGB avec Pixel Bender</title>
		<link>http://www.brainswitch.org/2011/10/decomposition-rgb-avec-pixel-bender/</link>
		<comments>http://www.brainswitch.org/2011/10/decomposition-rgb-avec-pixel-bender/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 23:00:11 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Code source]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Pixel-bender]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=141</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2011/10/rgb1.jpg" alt="" title="rgb1" width="1100" height="450" class="alignnone size-full wp-image-143" />

Il est possible très simplement avec Pixel Bender de décomposer une image RGB en ses 3 composantes rouge, verte et bleue. Il est tout aussi facile de les manipuler et de les filtrer pour obtenir divers effets applicables à un flux vidéo provenant d'une webcam par exemple, comme dans cette animation.]]></description>
			<content:encoded><![CDATA[<p><object id="animFlash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1100" height="453" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="bgcolor" value="#000000" /><param name="allowScriptAccess" value="sameDomain" /><param name="quality" value="high" /><param name="src" value="http://brainswitch.org/swf/camrgb.swf" /><param name="name" value="animFlash" /><param name="allowFullScreen" value="true" /><embed id="animFlash" type="application/x-shockwave-flash" width="1100" height="453" src="http://brainswitch.org/swf/camrgb.swf" name="animFlash" quality="high" allowscriptaccess="sameDomain" allowFullScreen="true" bgcolor="#000000"></embed></object></p>
<p>Il est possible très simplement avec Pixel Bender de décomposer une image RGB en ses 3 composantes rouge, verte et bleue. Il est tout aussi facile de les manipuler et de les filtrer pour obtenir divers effets applicables à un flux vidéo provenant d&#8217;une webcam par exemple, comme dans cette animation.<br />
&nbsp;</p>
<p><strong>Pixélisation d&#8217;une image avec Pixel Bender</strong></p>
<p>Pour pixéliser une image à l&#8217;aide de Pixel Bender, chaque pixel de l&#8217;image source va être représenté par un carré de coté c sur l&#8217;image de sortie (l&#8217;image de sortie sera donc c fois plus grande que l&#8217;image source). Dans l&#8217;image de sortie chaque carré prendra la couleur d&#8217;un seul pixel de l&#8217;image source. Il faut donc récupérer, pour chaque carré, c fois la couleur de chaque pixel de l&#8217;image source en largeur et c fois la couleurs de chaque pixel de l&#8217;image source en hauteur. On détermine donc la couleur de chaque pixel de coordonnées (x,y) de l&#8217;image de sortie en récupérant la partie entière de la division de x et y par la dimension c du carré.</p>
<p>Ainsi, pour les coordonnées x et y de l&#8217;image de sortie allant de 0 à c-1, les parties entières ex et ey des divisions x/c et y/c sont égales à 0. Pour les coordonnées x et y de l&#8217;image de sortie allant de c à 2c-1, les parties entières ex et ey des divisions x/c et y/c sont égales à 1 et ainsi de suite. Il suffit de lire la couleur du pixel de coordonnées (ex,ey) de l&#8217;image source pour déterminer la couleur de chaque carré correspondant de l&#8217;image de sortie.</p>
<pre class="brush: cpp; title: ; notranslate">
&lt;languageVersion : 1.0;&gt;

kernel SquareDecomposition
&lt;   namespace : &quot;brainswitch&quot;;
    vendor : &quot;Brainswitch&quot;;
    version : 1;
&gt;

{
    input image4 src;
    output pixel4 dst;

    void evaluatePixel()
    {
        const float squareWidth = 10.0;

        float outX = outCoord().x;
        float outY = outCoord().y;

        float positionX = floor( outX/squareWidth );
        float positionY = floor( outY/squareWidth );

        float3 offset = float3( positionX, positionY, 0.0 );
        float4 outColor = sampleNearest( src, offset.xy );

        dst.r = outColor.r;
        dst.g = outColor.g;
        dst.b = outColor.b;
        dst.a = 1.0;
    }
}
</pre>
<p>L&#8217;image suivante a été obtenue à partir de ce shader.</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2011/10/firefox1.jpg" alt="" title="firefox1" width="1100" height="560" class="alignnone size-full wp-image-144" /><br />
&nbsp;<br />
<strong>Pixélisation et décomposition RGB d&#8217;une image avec Pixel Bender</strong></p>
<p>Dans chaque carré de l&#8217;image de sortie on peut maintenant décomposer la couleur du pixel d&#8217;entrée correspondant en bandes rouge, verte et bleue. Si on veut dessiner dans chaque carré, 3 bandes de largeur b et de longueur c, on aura c = 3b. On peut également séparer les carrés par un espace d&#8217;un pixel, dans ce cas c vaudra 3b+1.</p>
<p>En largeur, la couleur de chaque pixel de la première bande, sera égale à la composante rouge du pixel correspondant de l&#8217;image source, idem pour les deuxième et troisième bandes avec les composantes verte et bleue. On aura donc en x, sur l&#8217;image de sortie, une trait rouge, une trait vert, une trait bleu, puis un point noir puis de nouveau une trait rouge et ainsi de suite. On va se servir de la fonction mod (modulo) de Pixel Bender pour réaliser cette décomposition. Si l&#8217;on choisit b=3, c sera égal à 3*3+1 soit 10, et on aura pour x (la coordonnée x du pixel de l&#8217;image de sortie) variant de 0 à 19:</p>
<p>0 mod 10 = 0, 1 mod 10 = 1, 2 mod 10 = 2, pour le rouge<br />
3 mod 10 = 3, 4 mod 10 = 4, 5 mod 10 = 5, pour le vert<br />
6 mod 10 = 6, 7 mod 10 = 7, 8 mod 10 = 8, pour le bleu<br />
9 mod 10 = 9, pour le noir<br />
10 mod 10 = 0, 11 mod 10 = 1, 12 mod 10 = 2, pour le rouge<br />
13 mod 10 = 3, 14 mod 10 = 4, 15 mod 10 = 5, pour le vert<br />
16 mod 10 = 6, 17 mod 10 = 7, 18 mod 10 = 8, pour le bleu<br />
19 mod 10 = 9, pour le noir</p>
<p>Ainsi, pour les coordonnées x de chaque pixel de l’image de sortie, x mod 10 retournera toujours des valeurs de 0 à 9 nous permettant de déterminer sa couleur. En hauteur (coordonnées y de chaque pixel de l’image de sortie), le principe est le même mais on se soucie uniquement de la valeur 9 pour tracer un trait noir de séparation entre les carrées.</p>
<pre class="brush: cpp; title: ; notranslate">
&lt;languageVersion : 1.0;&gt;

kernel RVBSquareDecomposition
&lt;   namespace : &quot;brainswitch&quot;;
    vendor : &quot;Brainswitch&quot;;
    version : 1;
&gt;

{
    input image4 src;
    output pixel4 dst;

    void evaluatePixel()
    {
        const float squareWidth = 10.0;

        float outX = outCoord().x;
        float outY = outCoord().y;

        float positionX = floor( outX/squareWidth );
        float positionY = floor( outY/squareWidth );

        float3 offset = float3( positionX, positionY, 0.0 );
        float4 outColor = sampleNearest( src, offset.xy );

        float stepX = mod( floor( outX/1.0 ), squareWidth );
        float stepY = mod( floor( outY/1.0 ), squareWidth );

        if ( stepX == 0.0 || stepX == 1.0 || stepX == 2.0 ) {
            dst.r = outColor.r;
            dst.g = 0.0;
            dst.b = 0.0;
        } else if ( stepX == 3.0 || stepX == 4.0 || stepX == 5.0 ) {
            dst.r = 0.0;
            dst.g = outColor.g;
            dst.b = 0.0;
        } else if ( stepX == 6.0  || stepX == 7.0 || stepX == 8.0 ) {
            dst.r = 0.0;
            dst.g = 0.0;
            dst.b = outColor.b;
        } else if ( stepX == 9.0 ) {
            dst.r = 0.0;
            dst.g = 0.0;
            dst.b = 0.0;
        }

        if ( stepY  == 9.0 ) {
            dst.r = 0.0;
            dst.g = 0.0;
            dst.b = 0.0;
        }

        dst.a = 1.0;
    }
}
</pre>
<p>L&#8217;image suivante a été obtenue à partir de ce shader.</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2011/10/firefox2.jpg" alt="" title="firefox2" width="1100" height="562" class="alignnone size-full wp-image-145" /><br />
&nbsp;</p>
<p><strong>Exécution du shader à l&#8217;aide d&#8217;un objet ShaderJob</strong></p>
<p>Un objet <a href="http://help.adobe.com/fr_FR/FlashPlatform/reference/actionscript/3/flash/display/ShaderJob.html?filter_flex=4.1&#038;filter_flashplayer=10.2&#038;filter_air=2.6">ShaderJob</a> permet d’exécuter un shader en mode autonome de manière synchrone ou asynchrone. Le morceau de code suivant charge une image et le shader RVBSquareDecomposition.pbj, crée et éxécute un ShaderJob avec la fonction imgToRGBSquare puis affiche le résultat à l&#8217;écran. </p>
<pre class="brush: as3; title: ; notranslate">
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shader;
import flash.display.ShaderJob;

// classes issues du framework Flex: indispensables pour utiliser l'embed dans Flash
import mx.core.*;

[Embed ( source=&quot;assets/image.jpg&quot; )]
var InputImg:Class;

[Embed ( source=&quot;assets/RVBSquareDecomposition.pbj&quot;, mimeType = &quot;application/octet-stream&quot; )]
var RgbSquare:Class;

var inputImg:Bitmap					= new InputImg();
var inputBitmapData:BitmapData		= inputImg.bitmapData;
var outputBitmapData:BitmapData		= new BitmapData( 1100, 650, false, 0x000000 );
var squaresBitmapData:BitmapData	= new BitmapData( 1100, 650, false, 0x000000 );

var screenBitmap:Bitmap = new Bitmap ( outputBitmapData );
addChild( screenBitmap );

squaresBitmapData = imgToRGBSquare( inputBitmapData, 10, true );
outputBitmapData.copyPixels( squaresBitmapData, new Rectangle( 0, 0, 1100, 650 ), new Point( 0, 0 ) );

function imgToRGBSquare( input:BitmapData, squareSize:int, cleanup:Boolean = true ):BitmapData
{
	// Création et configuration d'un ShadeJob
	var shader:Shader = new Shader();
	shader.byteCode = new RgbSquare(); // Instanciation d'un objet byteCode
	shader.data.src.input = input; // L'image source envoyée au shader 

	var outputWidth:int = input.width;
	var outputHeight:int = input.height;

	// Création d'une Bitmap pour récupérer les données de sortie du shader
	var output:BitmapData = new BitmapData( outputWidth * squareSize, outputHeight * squareSize );

	// Création du shaderJob
	var job:ShaderJob = new ShaderJob();
	job.target = output; // ShaderJob utilise l'objet output comme sortie
	job.shader = shader; // Le shader assigné au ShaderJob
	job.start( true ); // Exécution synchrone, false pour une éxécution asynchrone

	return output;
}
</pre>
<p>Il est possible de faire évoluer ce shader en ajoutant des conditions ou en effectuant un ajustement de couleurs pour obtenir des images totalement différentes. Il est également possible de convertir les pixels en traits ou en toute autre formes plutôt qu&#8217;en carrés. Les images ci-dessous sont issue de l&#8217;animation du haut de la page, les composantes RGB des pixels de l&#8217;image source sont filtrées en fonction de leur intensité.<br />
&nbsp;<br />
<img src="http://www.brainswitch.org/wp-content/uploads/2011/10/rgb4.jpg" alt="" title="rgb4" width="1100" height="450" class="alignnone size-full wp-image-146" /><br />
&nbsp;</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2011/10/rgb2.jpg" alt="" title="rgb2" width="1100" height="450" class="alignnone size-full wp-image-147" /><br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2011/10/decomposition-rgb-avec-pixel-bender/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Différence centrale avec Cinder</title>
		<link>http://www.brainswitch.org/2011/09/difference-centrale-avec-cinder/</link>
		<comments>http://www.brainswitch.org/2011/09/difference-centrale-avec-cinder/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 21:40:20 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Cinder]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=126</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2011/09/centraldiff.jpg" alt="" title="centraldiff" width="1100" height="450" class="alignnone size-full wp-image-137" />

Cela faisait un certain temps que je voulais travailler avec un langage plus performant que l'AS3. Je connaissais déjà Processing que j'ai un peu testé mais ayant déjà programmé par le passé en C++, je me suis laissé tenter par <a href="http://libcinder.org/">Cinder</a>.]]></description>
			<content:encoded><![CDATA[<p>Cela faisait un certain temps que je voulais travailler avec un langage plus performant que l&#8217;AS3. Je connaissais déjà Processing que j&#8217;ai un peu testé mais ayant déjà programmé par le passé en C++, je me suis laissé tenter par <a href="http://libcinder.org/">Cinder</a>. En fait j&#8217;ai hésité entre <a href="http://www.openframeworks.cc/">openFrameworks</a> et Cinder. Le choix n&#8217;a pas été facile, d&#8217;un coté openFrameworks doté d&#8217;une communauté importante et qui est,  parait-il, plus abordable, d&#8217;un autre coté Cinder beaucoup plus récent et moins bien documenté mais contenant une bonne quantité d&#8217;exemples permettant de se faire rapidement une idée des possibilités. Même si un énorme travail a été réalisé pour rendre la prise en main facile, ça reste du C++, c&#8217;est donc une approche totalement différente de l&#8217;AS3 et pour aller plus loin et développer ses propres programmes il faut quand même s&#8217;y mettre sérieusement si on a pas l&#8217;habitude de ce langage. Je ne suis qu&#8217;au début, mais quand je vois la puissance de Cinder et OpenGL, je ne regrette pas d&#8217;avoir passé du temps à me remettre au C++ et j&#8217;encourage tous ceux qui voudraient se lancer dans un langage de haut niveau à essayer Cinder.</p>
<p>Pour commencer, avant d&#8217;aborder vraiment la 3D avec OpenGL, j&#8217;ai adapté l&#8217;algorithme de différence centrale de <a href="http://unitzeroone.com/blog/">Ralph Hauwert</a> que j&#8217;avais déjà testé avec une webcam en Flash. Je suis passé d&#8217;une animation de 50000 particules en 700&#215;465 à 650000 particules en fullscreen hd à 60 fps. Soit une différence de performance énorme, et je pourrais encore augmenter le nombre de particules. Le programme est en réalité quasiment intégralement réalisé à l&#8217;aide de shaders et de <a href="http://www.ozone3d.net/tutorials/vertex_displacement_mapping.php">vertex shaders</a>.</p>
<p>A l&#8217;avenir j&#8217;essaierai de publier des sources en fonction de mes progrès mais si vous désirez vous mettre au C++ pour réaliser ce genre d&#8217;animation je vous conseille de lire cette <a href="http://forum.libcinder.org/#topic/23286000000153013">discussion</a> sur le forum de Cinder.<br />
&nbsp;</p>
<p>Quelques captures d&#8217;écran:</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2011/09/gpucd1p.jpg" alt="" title="gpucd1p" width="850" height="478" class="alignnone size-full wp-image-127" /></p>
<p>&nbsp;</p>
<p><img src="http://www.brainswitch.org/wp-content/uploads/2011/09/gpucd3p.jpg" alt="" title="gpucd3p" width="850" height="478" class="alignnone size-full wp-image-128" /></p>
<p>&nbsp;<br />
J&#8217;ai essayé également de réaliser une vidéo, mais la qualité n&#8217;est pas terrible, en HD c&#8217;est un peu mieux mais ça reste légèrement flou.</p>
<p><iframe src="http://player.vimeo.com/video/32239843" width="850" height="478" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2011/09/difference-centrale-avec-cinder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>55000 particules avec ma webcam</title>
		<link>http://www.brainswitch.org/2011/07/55000-particules-avec-ma-webcam/</link>
		<comments>http://www.brainswitch.org/2011/07/55000-particules-avec-ma-webcam/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 22:34:18 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=118</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2011/07/cam.jpg" alt="" title="cam" width="1100" height="450" class="alignnone size-full wp-image-119" />

Ralph Hauwert a posté sur son <a href="http://unitzeroone.com/blog/2011/01/16/the-particle-sessions-part-one-is-this-it/">blog</a> un tutoriel exceptionnel sur l'animation de particules en as3. Plusieurs sujets y sont traités en détail et illustrés par des exemples concrets: bruit de Perlin, pixel shader, optimisation du code.. un must!]]></description>
			<content:encoded><![CDATA[<p><object id="animFlash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1100" height="866" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="bgcolor" value="#000000" /><param name="allowScriptAccess" value="sameDomain" /><param name="quality" value="high" /><param name="src" value="http://brainswitch.org/swf/webcamparticles/particles.swf" /><param name="name" value="animFlash" /><embed id="animFlash" type="application/x-shockwave-flash" width="1100" height="866" src="http://brainswitch.org/swf/webcamparticles/particles.swf" name="animFlash" quality="high" allowscriptaccess="sameDomain" bgcolor="#000000"></embed></object></p>
<p>Ralph Hauwert a posté sur son <a href="http://unitzeroone.com/blog/2011/01/16/the-particle-sessions-part-one-is-this-it/">blog</a> un tutoriel exceptionnel sur l&#8217;animation de particules en as3. Plusieurs sujets y sont traités en détail et illustrés par des exemples concrets: bruit de Perlin, pixel shader, optimisation du code.. un must! Il fallait que je teste avec une webcam pour voir ce que ça donne, résultat: 55000 particules à 60fps sans le moindre ralentissement sur un AMD Athlon Dual-Core de 2 ans..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2011/07/55000-particules-avec-ma-webcam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>3D ribbons avec Away3D</title>
		<link>http://www.brainswitch.org/2011/06/3d-trails-avec-away3d/</link>
		<comments>http://www.brainswitch.org/2011/06/3d-trails-avec-away3d/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 21:38:14 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Code source]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.brainswitch.org/?p=100</guid>
		<description><![CDATA[<img src="http://www.brainswitch.org/wp-content/uploads/2011/06/trails.jpg" alt="" title="trails" width="1100" height="450" class="alignnone size-full wp-image-116" />

Le mois dernier j'ai commencé à travailler sur les ribbons ou rubans. Après avoir fait quelques essais en 2D j'ai réalisé une classe pour away3D que j'ai utilisée dans cette animation.]]></description>
			<content:encoded><![CDATA[<p><object id="animFlash" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1100" height="700" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="bgcolor" value="#2b3843" /><param name="allowScriptAccess" value="sameDomain" /><param name="quality" value="high" /><param name="src" value="http://www.brainswitch.org/swf/ribbons3d.swf" /><param name="name" value="animFlash" /><param name="allowFullScreen" value="true" /><embed id="animFlash" type="application/x-shockwave-flash" width="1100" height="700" src="http://www.brainswitch.org/swf/ribbons3d.swf" name="animFlash" quality="high" allowscriptaccess="sameDomain" allowFullScreen="true" bgcolor="#2b3843"></embed></object></p>
<p><strong>Cliquez sur l&#8217;animation pour passer en mode plein écran.</strong></p>
<p>Le mois dernier j&#8217;ai commencé à travailler sur les ribbons ou rubans. Après avoir fait quelques essais en 2D j&#8217;ai réalisé une classe pour away3D que j&#8217;ai utilisée dans cette animation. Avec cette classe il est possible d&#8217;ajouter une forme au ruban. C&#8217;est un paramètre optionnel que j&#8217;ai appelé profile. A l&#8217;aide d&#8217;un profile vous pouvez créer des rubans effilés ou pointus par exemple, si vous ne définissez pas de profile le ruban sera rectiligne. Vous trouverez des explications plus détaillées à ce sujet dans le fichier exemple fournis avec la classe téléchargeable <a href="http://www.brainswitch.org/src/ribbons3D.zip">ici</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainswitch.org/2011/06/3d-trails-avec-away3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

