{
	"title": "Bruitage d'images vectorielles",
	"summary": "Un court pipeline de filtres générant une image du soleil",
	"date_published": "2021-03-16",
	"authors": [
		{
			"name": "PolariTOON"
		}
	],
	"external_url": "./vector-graphics-noising",
	"id": "vector-graphics-noising",
	"image": "./*.svg",
	"content_html": "<h2>Introduction</h2>\n<p>Hier est paru <a href=\"//css-tricks.com/creating-patterns-with-svg-filters/\">un article sur <em>CSS Tricks</em></a> par Bence Szabó, traitant de la création de motifs à base de filtres <em>SVG</em>. Recourir à dégradés <em>CSS</em> pour générer des motifs ne m'est pas inconnu, mais je n'ai jamais pris le temps de me pencher réellement sur les techniques équivalentes en <em>SVG</em>. Or le champ des possibles qu'offre <em>SVG</em> me semble bien plus large, notamment grâce à la possibilité de générer du bruit. J'ai donc voulu essayer, et tel un enfant faisant son premier dessin, j'ai représenté... le soleil.</p>\n<h2>Ciel étoilé</h2>\n<p>J'ai repris quasiment telle quelle l'idée du fond étoilé généré pseudo-aléatoirement avec du bruit via l'élément <code>&lt;feTurbulence /&gt;</code>. J'ai juste ajusté les différents poids de la matrice pour avoir des étoiles de couleurs variées, quoiqu'essentiellement jaunes, au lieu d'être systématiquement blanches.</p>\n<figure>\n\t<figcaption>Code <em>SVG</em> et rendu d'un bruit de fond</figcaption>\n\t<pre><code>&lt;filter id=\"sky\"&gt;&#x0A;&#x09;&lt;feTurbulence type=\"fractalNoise\" baseFrequency=\".25\" /&gt;&#x0A;&#x09;&lt;feColorMatrix values=\"32 0 0 0 -24&#x0A;&#x09;                       24 0 0 0 -18&#x0A;&#x09;                       16 0 0 0 -12&#x0A;&#x09;                       0 0 0 0 1\" /&gt;&#x0A;&lt;/filter&gt;&#x0A;&lt;rect width=\"100%\" height=\"100%\" filter=\"url(#sky)\" /&gt;&#x0A;</code></pre>\n\t<picture><img width=\"640\" height=\"360\" alt=\"\" src=\"./background.svg\" loading=\"lazy\" /></picture>\n</figure>\n<p>Au passage, en voulant indenter la chose, j'ai découvert à mes dépens que <em>Webkit</em> n'apprécie pas les espaces en début et fin de la valeur de l'attribut <code>values=\"\"</code> de l'élément <code>&lt;feColorMatrix /&gt;</code>. La solution de contournement est vite trouvée...</p>\n<h2>Soleil</h2>\n<p>Un simple disque jaune pour dépeindre le soleil aurait fait tâche sur ce fond étoilé. Pour réprésenter son rayonnement et éviter d'avoir un contour trop net, j'ai ajouté un dégradé externe variant du jaune au rouge en partant du bord.</p>\n<figure>\n\t<figcaption>Code <em>SVG</em> et rendu d'un disque jaune rayonnant un dégradé jaune-rouge</figcaption>\n\t<pre><code>&lt;radialGradient id=\"gradient\" fr=\"33.3%\" r=\"50%\"&gt;&#x0A;&#x09;&lt;stop offset=\"3.125%\" stop-color=\"#ff0f\" /&gt;&#x0A;&#x09;&lt;stop offset=\"6.25%\" stop-color=\"#fc0c\" /&gt;&#x0A;&#x09;&lt;stop offset=\"12.5%\" stop-color=\"#f909\" /&gt;&#x0A;&#x09;&lt;stop offset=\"25%\" stop-color=\"#f606\" /&gt;&#x0A;&#x09;&lt;stop offset=\"50%\" stop-color=\"#f303\" /&gt;&#x0A;&#x09;&lt;stop offset=\"100%\" stop-color=\"#f000\" /&gt;&#x0A;&lt;/radialGradient&gt;&#x0A;&lt;circle cx=\"50%\" cy=\"50%\" r=\"96\" fill=\"url(#gradient)\" /&gt;&#x0A;</code></pre>\n\t<picture><img width=\"640\" height=\"360\" alt=\"\" src=\"./disk.svg\" loading=\"lazy\" /></picture>\n</figure>\n<p>Mieux. Un peu trop parfait en fait. Comment faire pour avoir une forme un peu moins ronde&nbsp;? Il se trouve que l'élément <code>&lt;feDisplacementMap/&gt;</code> permet précisément de créer un effet de distortion bidirectionnelle sur une image. Et en lui donnant du bruit en entrée, on peut obtenir une sorte de blob à la forme assez irrégulière&nbsp;! N'en abusons pas, tout de même.</p>\n<figure>\n\t<figcaption>Code <em>SVG</em> et rendu d'un blob</figcaption>\n\t<pre><code>&lt;filter id=\"sun\"&gt;&#x0A;&#x09;&lt;feTurbulence type=\"fractalNoise\" baseFrequency=\".125\" numOctaves=\"2\" /&gt;&#x0A;&#x09;&lt;feDisplacementMap xChannelSelector=\"R\" yChannelSelector=\"G\" in=\"SourceGraphic\" scale=\"16\" /&gt;&#x0A;&lt;/filter&gt;&#x0A;&lt;circle cx=\"50%\" cy=\"50%\" r=\"96\" filter=\"url(#sun)\" /&gt;&#x0A;</code></pre>\n\t<picture><img width=\"640\" height=\"360\" alt=\"\" src=\"./blob.svg\" loading=\"lazy\" /></picture>\n</figure>\n<p>Pas mal&nbsp;! On croirait voir les éruptions solaires ionisant la couronne du soleil&nbsp;! Il ne manque plus que la touche finale&nbsp;: animer le tout. Mais pour garder une animation régulière avec une échelle de bruit assez uniforme, la technique consacrée, bien qu'assez simple à mettre en place, semble vraiment relever de la magie. On peut en voir <a href=\"https://codepen.io/mullany/pen/BWKePz\">une démonstration sur <em>Codepen</em></a> par Michael Mullany. Au lieu d'animer la fréquence, l'astuce est de passer le bruit à travers un filtre de couleurs qui opère une rotation progressive sur la teinte selon le cercle chromatique. Cela permet d'exploiter le bruit généré sur le troisième canal de couleur, au lieu de se limiter à deux comme c'était le cas précédemment, mais aussi à l'animation de boucler.</p>\n<figure>\n\t<figcaption>Code <em>SVG</em> et rendu d'un blob animé</figcaption>\n\t<pre><code>&lt;filter id=\"sun\"&gt;&#x0A;&#x09;&lt;feTurbulence type=\"fractalNoise\" baseFrequency=\".125\" numOctaves=\"2\" /&gt;&#x0A;&#x09;&lt;feColorMatrix type=\"hueRotate\"&gt;&#x0A;&#x09;&#x09;&lt;animate attributeName=\"values\" from=\"0\" to=\"360\" dur=\"4s\" repeatCount=\"indefinite\" /&gt;&#x0A;&#x09;&lt;/feColorMatrix&gt;&#x0A;&#x09;&lt;feDisplacementMap xChannelSelector=\"R\" yChannelSelector=\"G\" in=\"SourceGraphic\" scale=\"16\" /&gt;&#x0A;&lt;/filter&gt;&#x0A;&lt;circle cx=\"50%\" cy=\"50%\" r=\"96\" filter=\"url(#sun)\" /&gt;&#x0A;</code></pre>\n\t<picture><img width=\"640\" height=\"360\" alt=\"\" src=\"./rotation.svg\" loading=\"lazy\" /></picture>\n</figure>\n<p>Je reste étonné du si peu de code nécessaire pour parvenir à un tel effet. Assemblons tout ça et jetons un œil au résultat final sans plus attendre&nbsp;!</p>\n<h2>Rendu</h2>\n<figure>\n\t<figcaption>Rendu du soleil devant un ciel étoilé (<a href=\"./sun-over-a-starry-sky.svg\">voir le code source</a>)</figcaption>\n\t<picture><img width=\"640\" height=\"360\" alt=\"\" src=\"./sun-over-a-starry-sky.svg\" loading=\"lazy\" /></picture>\n</figure>\n<p>Une démonstration est aussi disponible <a href=\"./vector-graphics-noising\">ici</a>.</p>\n",
	"banner_image": "./*.png",
	"tags": []
}