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 .
la source
Réponses:
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:
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):
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.
la source