Comment générer du bruit procédural sur une sphère?

15

Je voudrais générer du bruit procédural à la surface d'une sphère (par exemple pour générer de façon procédurale des planètes ou des boules texturées en marbre). Bien sûr, je pourrais simplement prendre un algorithme de bruit standard et le mapper sur la sphère, mais cela a tous les problèmes de projeter un plan sur une sphère, comme les distorsions sur les pôles ou ailleurs.

Je suppose que je pourrais générer du bruit de volume et "couper" la sphère, mais cela semble inutilement inefficace - et si le bruit a des artefacts basés sur la grille, ceux-ci n'apparaîtront toujours pas uniformément sur la sphère. De plus, au moins dans le cas du bruit Simplex, la découpe de tranches 2D dans du bruit 3D est généralement différente de la génération immédiate de bruit 2D.

Existe-t-il un moyen d'éviter ces problèmes, par exemple en générant du bruit nativement sur la sphère? Le bruit doit avoir au moins la qualité du bruit Perlin , idéalement celle du bruit Simplex .

Martin Ender
la source
Peut-être une projection triplanaire, comme on le voit dans GPU Gems 3 ? La question est de savoir si le bruit serait flou ou indésirable s'il se mélange entre différentes projections.
Nathan Reed
J'ai ajouté une autre méthode possible à mon message. Il peut être utile de clarifier votre question avec des exigences plus détaillées. c'est-à-dire pourquoi une tranche 2D de bruit 3D ne satisfait-elle pas vos exigences visuelles? Quelles sont vos exigences de performance?
John Calsbeek
@JohnCalsbeek Honnêtement, je n'ai pas d'exigences strictes à portée de main. C'était juste une question qui m'intéressait et sur laquelle je pensais essayer la beta privée. Bien sûr, couper une tranche 2D du bruit 3D sera suffisant pour de nombreuses applications, mais je suis sûr que cela aura un impact sur les performances et des anisotropies (qui peuvent ou non être visibles). "Couper la sphère du bruit 3D est votre meilleure option, car ..." est certainement une réponse valable.
Martin Ender
Vous pourriez vérifier ce shadertoy qui fait du bruit sur une sphère: shadertoy.com/view/4sfGzS
Alan Wolfe

Réponses:

15

J'envisagerais simplement d'aller avec du bruit 3D et de l'évaluer à la surface de la sphère.

Pour le bruit de gradient qui est naturellement dans le domaine de la surface de la sphère, vous avez besoin d'un motif régulier de points d'échantillonnage sur la surface qui ont des informations de connectivité naturelle, avec une surface à peu près égale dans chaque cellule, afin que vous puissiez interpoler ou additionner des valeurs adjacentes. Je me demande si quelque chose comme une grille de Fibonacci pourrait fonctionner:

Grille de Fibonacci à la surface d'une sphère

Je n'ai pas parcouru les mathématiques pour déterminer combien de travail il faudrait pour déterminer les indices et la distance de vos quatre voisins (je ne sais même pas si vous finissez par avoir quatre voisins bien définis dans tous les cas), et je pense que cela peut être moins efficace que de simplement utiliser du bruit 3D.

Edit: Quelqu'un d'autre a mâché les maths! Voir ce nouvel article sur la cartographie sphérique de Fibonacci . Il semble qu'il serait simple de l'adapter au bruit de la sphère.


Si vous effectuez le rendu d'une sphère, et pas seulement l'évaluation du bruit à la surface d'une sphère, et que vous êtes prêt à tesseller votre sphère à la résolution de votre réseau de bruit, vous pouvez créer une grille géodésique à la surface de la sphère (un icosaèdre subdivisé, d'habitude):

Sphère géodésique

Chaque sommet de la sphère peut avoir un gradient généré de façon aléatoire pour le bruit de gradient. Pour obtenir ces informations dans le pixel shader (sauf si vous souhaitez une interpolation simple comme le bruit de valeur), vous pouvez avoir besoin d'une technique comme le rendu filaire de cet article avec les coordonnées barycentriques : effectuez un rendu non indexé, chaque sommet contenant les coordonnées barycentriques de ce sommet dans le triangle . Vous pouvez ensuite lire SV_PrimitiveID(ou l'équivalent OpenGL) dans le pixel shader, lire les trois gradients de bruit des sommets en fonction du triangle sur lequel vous vous trouvez et utiliser le calcul de bruit que vous souhaitez en utilisant les coordonnées barycentriques interpolées.

Je pense que la partie la plus difficile de cette méthode consiste à créer un schéma pour mapper votre ID de triangle à trois échantillons afin de rechercher les valeurs de bruit à chaque sommet.

Si vous avez besoin de plusieurs octaves de bruit ou de bruit à une résolution plus fine que votre modèle de sphère, vous pouvez peut-être faire une grille géodésique grossière avec des sommets et faire quelques niveaux de subdivision dans le pixel shader. c'est-à-dire à partir des coordonnées barycentriques, déterminez dans quel triangle subdivisé vous seriez si le maillage était encore tessellé, puis déterminez ce que l'ID primitif et les coordonnées barycentriques seraient pour ce triangle.

John Calsbeek
la source
2
Je n'avais jamais entendu parler des grilles de Fibonacci auparavant; c'est plutôt cool!
Nathan Reed
C'est un papier fascinant. Il semble que vous puissiez ajuster les paramètres pour vous rapprocher d'une grille carrée ou hexagonale, ce qui permettrait différentes approches de génération de bruit.
trichoplax
J'ai eu des résultats pas mal mauvais en interpolant près des bords de la tuile (bordé), mais cela dépend de l'effet que vous essayez d'obtenir et des paramètres de bruit exacts. Fonctionne très bien pour un bruit quelque peu flou, pas si bon avec des pics / à grains fins.