mirror of
https://github.com/patriciogonzalezvivo/thebookofshaders
synced 2024-11-09 19:10:24 +00:00
Merge pull request #216 from yvan-sraka/fr-13
Corrects some mistakes in the French translation of Chapter 13
This commit is contained in:
commit
853538fc39
@ -5,10 +5,10 @@
|
|||||||
Le bruit peut avoir plusieurs significations selon les personnes. Les musiciens le trouveront dérangeant, les communicants le considèrent comme une interférence et les astrophysiciens comme un rayonnement cosmique.
|
Le bruit peut avoir plusieurs significations selon les personnes. Les musiciens le trouveront dérangeant, les communicants le considèrent comme une interférence et les astrophysiciens comme un rayonnement cosmique.
|
||||||
|
|
||||||
Toutes ces qualifications, nous ramènent à l'ancrage *physique* du bruit dans notre environnement. Commençons toutefois par quelque chose de plus simple et de plus fondamental ; les ondes et leurs propriétés.
|
Toutes ces qualifications, nous ramènent à l'ancrage *physique* du bruit dans notre environnement. Commençons toutefois par quelque chose de plus simple et de plus fondamental ; les ondes et leurs propriétés.
|
||||||
Une onde peut être considérée comme la variation d'une propriété dans le temps ; le son est une variation de la pression de l'air au fil du temps, une onde électro-magnétique est la fluctuation dans le temps d'un champs électrique et magnétique etc.
|
Une onde peut être considérée comme la variation d'une propriété dans le temps ; le son est une variation de la pression de l'air au fil du temps, une onde électro-magnétique est la fluctuation dans le temps d'un champs électrique et magnétique, etc...
|
||||||
Les deux caractéristiques importantes d'une onde sont sa *fréquence* et son *amplitude*.
|
Les deux caractéristiques importantes d'une onde sont sa *fréquence* et son *amplitude*.
|
||||||
|
|
||||||
L'équation d'une onde à une dimension peut s'écrire comme suit:
|
L'équation d'une onde à une dimension peut s'écrire comme suit :
|
||||||
|
|
||||||
<div class="simpleFunction" data="
|
<div class="simpleFunction" data="
|
||||||
float amplitude = 1.;
|
float amplitude = 1.;
|
||||||
@ -20,7 +20,7 @@ y = amplitude * sin(x * frequency);
|
|||||||
* À l'aide des fonctions de formes, faites varier l'amplitude au fil du temps.
|
* À l'aide des fonctions de formes, faites varier l'amplitude au fil du temps.
|
||||||
* Faites de même avec la fréquence.
|
* Faites de même avec la fréquence.
|
||||||
|
|
||||||
Félicitations! en suivant les deux dernières instructions, vous avez réussi à "moduler" l'onde et à créer une modulation de fréquence (FM) et d'amplitude (AM), et oui, exactement comme des ondes radio!
|
Félicitations ! En suivant les deux dernières instructions, vous avez réussi à "moduler" l'onde et à créer une modulation de fréquence (FM) et d'amplitude (AM), et oui, exactement comme des ondes radio !
|
||||||
|
|
||||||
Une seconde propriété intéressante des ondes est leur capacité à s'additionner, ce qu'on appelle la superposition.
|
Une seconde propriété intéressante des ondes est leur capacité à s'additionner, ce qu'on appelle la superposition.
|
||||||
Commentez/décommentez et jouez avec les les lignes suivantes en vous intéressant à la forme que prend l'onde lorsqu'on la combine à d'autres.
|
Commentez/décommentez et jouez avec les les lignes suivantes en vous intéressant à la forme que prend l'onde lorsqu'on la combine à d'autres.
|
||||||
@ -38,25 +38,25 @@ y *= amplitude*0.06;
|
|||||||
"></div>
|
"></div>
|
||||||
|
|
||||||
* Changez les valeurs de fréquence et d'amplitude des ondes additionnelles.
|
* Changez les valeurs de fréquence et d'amplitude des ondes additionnelles.
|
||||||
* Pouvez vous créer deux ondes qui s'annulent? à quoi ressemblera l'onde finale?
|
* Pouvez vous créer deux ondes qui s'annulent ? A quoi ressemblera l'onde finale ?
|
||||||
* Est-il possible d'additionner des ondes de manière à ce qu'elles s'amplifient l'une l'autre?
|
* Est-il possible d'additionner des ondes de manière à ce qu'elles s'amplifient l'une l'autre ?
|
||||||
|
|
||||||
En musique, chaque note est associée à une fréquence particulière. Les fréquences correspondent aux _notes_ de musique et doubler ou diviser par deux une fréquence permet de changer d'_octave_.
|
En musique, chaque note est associée à une fréquence particulière. Les fréquences correspondent aux _notes_ de musique et doubler ou diviser par deux une fréquence permet de changer d'_octave_.
|
||||||
|
|
||||||
Utilisons à présent un bruit de Perlin au lieu d'une sinusoïde!
|
Utilisons à présent un bruit de Perlin au lieu d'une sinusoïde !
|
||||||
Un bruit de Perlin de base ressemble globalement à une sinusoïde.
|
Un bruit de Perlin de base ressemble globalement à une sinusoïde.
|
||||||
Son amplitude et sa fréquence varient un peu mais l'amplitude reste globalement la même tandis que la fréquence
|
Son amplitude et sa fréquence varient un peu mais l'amplitude reste globalement la même tandis que la fréquence
|
||||||
reste cantonnée dans une zone restreinte autour de la fréquence centrale.
|
reste cantonnée dans une zone restreinte autour de la fréquence centrale.
|
||||||
Cependant, ce n'est pas une sinusoïde régulière et il est plus simple d'atteindre un résultat pseudo-aléatoire
|
Cependant, ce n'est pas une sinusoïde régulière et il est plus simple d'atteindre un résultat pseudo-aléatoire
|
||||||
en ajoutatnt plusieurs versions du bruit à différentes échelles (amplitudes).
|
en ajoutant plusieurs versions du bruit à différentes échelles (amplitudes).
|
||||||
Il est possible d'obtenir le même résultat avec des sinusoïdes mais il est nécessaire de combiner un nombre d'ondes important pour masquer leur nature périodique.
|
Il est possible d'obtenir le même résultat avec des sinusoïdes mais il est nécessaire de combiner un nombre d'ondes important pour masquer leur nature périodique.
|
||||||
|
|
||||||
En ajoutant différentes itérations du **bruit** (différents *octaves*),
|
En ajoutant différentes itérations du **bruit** (différents *octaves*),
|
||||||
dont on augmente la fréquence (la *lacunarité*) et dont on réduit l'amplitude (le *gain*), on obtient une granularité
|
dont on augmente la fréquence (la *lacunarité*) et dont on réduit l'amplitude (le *gain*), on obtient une granularité
|
||||||
qui nous permet de préserver les détails fins d'un bruit.
|
qui nous permet de préserver les détails fins d'un bruit.
|
||||||
|
|
||||||
Cette technique s'appelle "Fractional Brownian Motion" (*FBM*) ou simplement *bruit fractal*
|
Cette technique s'appelle "Fractional Brownian Motion" (*FBM*) ou simplement *bruit fractal*.
|
||||||
Voici un exemple d'implémentation:
|
Voici un exemple d'implémentation :
|
||||||
|
|
||||||
<div class="simpleFunction" data="// Properties
|
<div class="simpleFunction" data="// Properties
|
||||||
const int octaves = 1;
|
const int octaves = 1;
|
||||||
@ -76,18 +76,18 @@ for (int i = 0; i < octaves; i++) {
|
|||||||
|
|
||||||
* Changez progressivement le nombre d'octaves de 1 à 10 et regardez ce qui se produit.
|
* Changez progressivement le nombre d'octaves de 1 à 10 et regardez ce qui se produit.
|
||||||
* Au delà de 4 octaves, changez la valeur de lacunarité.
|
* Au delà de 4 octaves, changez la valeur de lacunarité.
|
||||||
* toujours au delà de 4 octaves, changez le gain et observez le résultat.
|
* Toujours au delà de 4 octaves, changez le gain et observez le résultat.
|
||||||
|
|
||||||
Notez comment, à chaque nouvel octave, la courbe semble gagner en détail.
|
Notez comment, à chaque nouvel octave, la courbe semble gagner en détail.
|
||||||
Notez également lors de l'ajout d'octaves que lorsqu'on zoome sur la courbe, les plus petits éléments ressemblent à l'ensemble et inversement ; c'est ce qu'on appelle l'*auto-similarité*:
|
Notez également lors de l'ajout d'octaves que lorsqu'on zoome sur la courbe, les plus petits éléments ressemblent à l'ensemble et inversement ; c'est ce qu'on appelle l'*auto-similarité* !
|
||||||
C'est une propriété importante des fractales et nous la simulons dans notre boucle.
|
C'est une propriété importante des fractales et nous la simulons dans notre boucle.
|
||||||
Nous ne créons pas une fractale à proprement parler puisque nous arrêtons l'ajout de bruit après quelques itérations mais d'un point de vue théorique,
|
Nous ne créons pas une fractale à proprement parler puisque nous arrêtons l'ajout de bruit après quelques itérations mais d'un point de vue théorique,
|
||||||
si nous pouvions laisser la boucle tourner indéfiniment et ajouter une somme infinies de bruits, nous obtiendrions une courbe fractale.
|
si nous pouvions laisser la boucle tourner indéfiniment et ajouter une somme infinies de bruits, nous obtiendrions une courbe fractale.
|
||||||
|
|
||||||
Dans un shader, la finesse du détail est limitée par la résolution écran ; si le résultat devient plus petit qu'un pixel, il n'ya pas vraiment de raison (ni de moyen) de le représenter à l'écran.
|
Dans un shader, la finesse du détail est limitée par la résolution écran ; si le résultat devient plus petit qu'un pixel, il n'ya pas vraiment de raison (ni de moyen) de le représenter à l'écran.
|
||||||
Nous avons donc pas besoin de boucles infinies pour obtenir une apparence fractale, il faut parfois un grand nombre d'itérations mais jamais une inifinité.
|
Nous avons donc pas besoin de boucles infinies pour obtenir une apparence fractale, il faut parfois un grand nombre d'itérations mais jamais une infinité.
|
||||||
|
|
||||||
le code suivant est un exemple d'implémentation de **FBM** en 2 dimensions:
|
Le code suivant est un exemple d'implémentation de **FBM** en 2 dimensions :
|
||||||
|
|
||||||
<div class='codeAndCanvas' data='2d-fbm.frag'></div>
|
<div class='codeAndCanvas' data='2d-fbm.frag'></div>
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ le code suivant est un exemple d'implémentation de **FBM** en 2 dimensions:
|
|||||||
* Changez le gain ligne 48
|
* Changez le gain ligne 48
|
||||||
|
|
||||||
Cette technique est communément utilisée pour créer des terrains procéduraux.
|
Cette technique est communément utilisée pour créer des terrains procéduraux.
|
||||||
l'*auto-similarité* du FBM se prête bien au rendu de montagnes ; le processus d'érosion qui donne leur forme aux montagnes
|
L'*auto-similarité* du FBM se prête bien au rendu de montagnes : le processus d'érosion qui donne leur forme aux montagnes
|
||||||
produit le même genre de motifs auto-similaires à grande échelle.
|
produit le même genre de motifs auto-similaires à grande échelle.
|
||||||
|
|
||||||
Si le sujet vous intéresse, nous vous invitons à lire [cet article d'Inigo Quiles sur les techniques de bruit avancées](http://www.iquilezles.org/www/articles/morenoise/morenoise.htm).
|
Si le sujet vous intéresse, nous vous invitons à lire [cet article d'Inigo Quiles sur les techniques de bruit avancées](http://www.iquilezles.org/www/articles/morenoise/morenoise.htm).
|
||||||
@ -104,7 +104,7 @@ Si le sujet vous intéresse, nous vous invitons à lire [cet article d'Inigo Qui
|
|||||||
![Blackout - Dan Holdsworth (2010)](holdsworth.jpg)
|
![Blackout - Dan Holdsworth (2010)](holdsworth.jpg)
|
||||||
|
|
||||||
Le principe du **FBM** peut être amendé pour obtenir différents effets comme par exemple cette **turbulence**.
|
Le principe du **FBM** peut être amendé pour obtenir différents effets comme par exemple cette **turbulence**.
|
||||||
On part de la structure de notre FBM mais au lieu d'accumuler la valeur signée(+/-) du bruit, on accumule sa valeur absolue(+) ce qui crée des *vallées* et des *collines*.
|
On part de la structure de notre FBM mais au lieu d'accumuler la valeur signée (+/-) du bruit, on accumule sa valeur absolue (+) ce qui crée des *vallées* et des *collines*.
|
||||||
|
|
||||||
```glsl
|
```glsl
|
||||||
for (int i = 0; i < OCTAVES; i++) {
|
for (int i = 0; i < OCTAVES; i++) {
|
||||||
@ -116,7 +116,7 @@ for (int i = 0; i < OCTAVES; i++) {
|
|||||||
|
|
||||||
<a href="../edit.php#13/turbulence.frag"><img src="turbulence-long.png" width="520px" height="200px"></img></a>
|
<a href="../edit.php#13/turbulence.frag"><img src="turbulence-long.png" width="520px" height="200px"></img></a>
|
||||||
|
|
||||||
Une seconde variante dite *ridge noise* (bruit de *crête* ou d'*arête*) consiste à inverser les vallées:
|
Une seconde variante dite *ridge noise* (bruit de *crête* ou d'*arête*) consiste à inverser les vallées :
|
||||||
|
|
||||||
```glsl
|
```glsl
|
||||||
n = abs(n); // create creases
|
n = abs(n); // create creases
|
||||||
@ -131,19 +131,19 @@ Il est intéressant de modifier l'échelle d'une itération de bruit en fonction
|
|||||||
En faisant ce genre de chose, nous nous éloignons du monde des fractales et entrons dans le monde méconnu des *multifractales*.
|
En faisant ce genre de chose, nous nous éloignons du monde des fractales et entrons dans le monde méconnu des *multifractales*.
|
||||||
Les *multifractales* ne sont pas aussi clairement définies mathématiquement que les fractales ce qui ne nous empêche pas de nous en servir dans les shaders.
|
Les *multifractales* ne sont pas aussi clairement définies mathématiquement que les fractales ce qui ne nous empêche pas de nous en servir dans les shaders.
|
||||||
Les simulations *multifractales* sont d'ailleurs très répandues dans les logiciels de génération de terrain.
|
Les simulations *multifractales* sont d'ailleurs très répandues dans les logiciels de génération de terrain.
|
||||||
Vous trouverez plus d'informations sur ce sujet au chapitre 16 de "Texturing and Modeling: a Procedural Approach" (3ème édition), de Kenton Musgrave.
|
Vous trouverez plus d'informations sur ce sujet au chapitre 16 de *"Texturing and Modeling: a Procedural Approach"* (3ème édition), de Kenton Musgrave.
|
||||||
Malheureusement le livre n'est plus édité depuis quelques années déjà mais vous le trouverez en bibliothèque ou d'occasion.
|
Malheureusement le livre n'est plus édité depuis quelques années déjà mais vous le trouverez en bibliothèque ou d'occasion.
|
||||||
Il est possible d'acheter un PDF de la première édition en ligne mais ça ne vaut pas le coup ; elle date de 1994 et ne contient aucune information sur la génération de terrain.
|
Il est possible d'acheter un PDF de la première édition en ligne mais ça ne vaut pas le coup ; elle date de 1994 et ne contient aucune information sur la génération de terrain.
|
||||||
|
|
||||||
### Domain Warping
|
### Domain Warping
|
||||||
|
|
||||||
[Inigo Quiles a également écrit cet article fascinant](http://www.iquilezles.org/www/articles/warp/warp.htm) sur le fait de "plier" ou "recouvrir" (*wrap*) l'espace d'un FBM à l'aide d'un FBM.
|
[Inigo Quiles a également écrit cet article fascinant](http://www.iquilezles.org/www/articles/warp/warp.htm) sur le fait de "plier" ou "recouvrir" (*wrap*) l'espace d'un FBM à l'aide d'un FBM.
|
||||||
ce serait le *rêve dans le rêve* d'Inception.
|
Ce serait le *rêve dans le rêve* d'Inception :
|
||||||
|
|
||||||
![ f(p) = fbm( p + fbm( p + fbm( p ) ) ) - Inigo Quiles (2002)](quiles.jpg)
|
![ f(p) = fbm( p + fbm( p + fbm( p ) ) ) - Inigo Quiles (2002)](quiles.jpg)
|
||||||
|
|
||||||
Le code suivant est une variation moins spectaculaire de cette technique, on utilise le *wrapping* (pliage, recouvrement, emballage) pour créer une sorte de nuage.
|
Le code suivant est une variation moins spectaculaire de cette technique, on utilise le *wrapping* (pliage, recouvrement, emballage) pour créer une sorte de nuage.
|
||||||
Notez la part que joue l'*auto-similarité* dans le résultat final.
|
Notez la part que joue l'*auto-similarité* dans le résultat final :
|
||||||
|
|
||||||
<div class='codeAndCanvas' data='clouds.frag'></div>
|
<div class='codeAndCanvas' data='clouds.frag'></div>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user