Pourquoi est-il deux fois plus cher de créer une fonction de bruit qui peut être carrelée?

13

J'ai vu à plusieurs endroits que faire une boucle de bruit Perlin de manière transparente nécessite de le calculer deux fois de manière légèrement différente et de résumer les deux résultats.

Cette FAQ mathématique sur le bruit Perlin donne une formule:

Floop(x,y,z)=(tz)F(x,y,z)+zF(x,y,zt)t

pour faire une fonction de bruit boucle dans la direction z . Il mentionne également que l' extension de ceci, à la boucle en 2 dimensions prendrait 4 évaluations de F et de boucle en 3 dimensions prendrait 8 évaluations de F .FzFF

Je comprends que cela donne une jointure transparente entre les tuiles qui est non seulement continue mais toujours différenciable, mais je m'attends intuitivement à ce que ce soit le cas si la fonction de bruit est simplement évaluée une fois avec des points de grille réduits modulo de la taille de tuile requise. Si la fonction de bruit est uniquement basée sur les points de grille immédiatement environnants (4 pour le bruit 2D, 8 pour le bruit 3D), il est certain que l'utilisation des points de grille les plus à gauche lorsque le point à calculer dépasse le bord droit de la tuile donnera la même qualité de bruit qu'entre tous les autres points du réseau?

Depuis que j'ai vu cette approche de calcul multiple à plusieurs endroits, je suppose qu'elle doit avoir un certain avantage, mais j'ai du mal à voir l'inconvénient de simplement replacer les points de la grille au début lorsqu'ils deviennent trop gros. Qu'est-ce que je rate?

trichoplax
la source

Réponses:

19

Il est regrettable que les gens le recommandent couramment. Mélanger entre deux (ou quatre, etc.) des copies traduites d'une fonction de bruit de cette manière est une très mauvaise idée. Non seulement c'est cher, mais cela ne produit même pas des résultats corrects!

Bruit de Perlin Bruit Perlin mélangé

Sur la gauche, il y a du bruit Perlin. À droite, deux instances de bruit Perlin, empilées et mélangées de gauche à droite.

La différence est assez subtile, mais vous pouvez voir que la deuxième image a un contraste plus faible dans une colonne verticale qui descend au milieu. C'est là que c'est un mélange à 50% entre deux instances différentes de la fonction de bruit. Un tel mélange ne ressemble pas à la fonction de bruit d'origine: il ressemble juste à un gâchis boueux.

OK, ce n'est donc pas si mal que de regarder le bruit brut ... mais si vous effectuez ensuite des transformations non linéaires sur l'image, le contraste non uniforme peut provoquer des problèmes. Par exemple, voici ces images au seuil de 60%. (Pensez à générer des îles dans un océan, par exemple.)

Bruit de Perlin seuil Bruit de Perlin mélangé à seuil

Vous pouvez maintenant voir clairement comment l'image de droite comporte moins de zones blanches plus petites au milieu.

Comme vous l'avez mentionné, pour le bruit basé sur une grille comme Perlin, une meilleure façon est de carreler les gradients pseudo-aléatoires aux points de la grille. C'est facile et peu coûteux à faire, puis vous pouvez appliquer l'algorithme d'interpolation aux dégradés comme d'habitude (un peu comme l'interpolation bilinéaire d'une texture de mosaïque). Cela produit du bruit de mosaïque sans aucun artefact bizarre, car il fonctionne avec l'algorithme de bruit sous-jacent plutôt que par dessus. Vous pouvez utiliser une stratégie similaire avec le bruit de Worley (bruit cellulaire) en juxtaposant les points d'entités aléatoires qu'il utilise comme base.

Avec plusieurs octaves de bruit, ce n'est pas toujours aussi simple. Si l'échelle relative entre les octaves (alias "lacunarité") n'est pas un nombre entier ou rationnel simple, alors vous ne pourrez peut-être pas trouver un point de mosaïque pratique où toutes les grilles d'octaves correspondent. Vous pouvez carreler chaque octave indépendamment, mais le bruit global ne serait toujours pas mosaïque dans ce cas.

Nathan Reed
la source
4
Les images côte à côte font vraiment la différence pour avoir une idée intuitive de l'explication. Je vais garder cela à l'esprit pour mes propres réponses.
trichoplax