Apparenté, relié, connexe:
Je voudrais générer du bruit Perlin tiled. Je travaille à partir des fonctions de Paul Bourke PerlinNoise*()
, qui sont comme ceci:
// alpha is the "division factor" (how much to damp subsequent octaves with (usually 2))
// beta is the factor that multiplies your "jump" into the noise (usually 2)
// n is the number of "octaves" to add in
double PerlinNoise2D(double x,double y,double alpha,double beta,int n)
{
int i;
double val,sum = 0;
double p[2],scale = 1;
p[0] = x;
p[1] = y;
for (i=0;i<n;i++) {
val = noise2(p);
sum += val / scale;
scale *= alpha;
p[0] *= beta;
p[1] *= beta;
}
return(sum);
}
Utiliser un code comme:
real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test
return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;
Donne ciel comme
Ce qui n'est pas tilé.
Les valeurs de pixel sont 0-> 256 (largeur et hauteur), et pixel (0,0) utilise (x, y) = (0,0) et pixel (256,256) utilise (x, y) = (1,1)
Comment puis-je le rendre tiled?
tiles
perlin-noise
bobobobo
la source
la source
Réponses:
Faire un bruit fBm parfaitement mélangeable comme ceci se fait en deux temps. Tout d’abord, vous devez rendre la fonction de bruit Perlin elle-même exploitable. Voici un code Python pour une fonction de bruit Perlin simple qui fonctionne avec toutes les périodes allant jusqu'à 256 (vous pouvez l'étendre trivialement autant que vous le souhaitez en modifiant la première section):
Le bruit de Perlin est généré à partir d'une somme de petits "surflets" qui sont le produit d'un gradient orienté de manière aléatoire et d'une fonction de réduction polynomiale séparable. Cela donne une région positive (jaune) et une région négative (bleue)
Les surflets ont une étendue de 2x2 et sont centrés sur les points du réseau entier, de sorte que la valeur du bruit Perlin à chaque point de l'espace est produite en faisant la somme des surplets aux coins de la cellule occupée.
Si vous faites en sorte que les directions du dégradé soient ajustées avec une certaine période, le bruit lui-même sera alors appliqué de manière transparente avec la même période. C'est pourquoi le code ci-dessus prend la coordonnée du réseau modulo la période avant de la hacher à travers la table de permutation.
L’autre étape est que, lors de la somme des octaves, vous souhaiterez redimensionner la période avec la fréquence de l’octave. Essentiellement, vous voudrez que chaque octave insère une seule fois l'image entière dans son intégralité, plutôt que plusieurs fois:
Mettez cela ensemble et vous obtenez quelque chose comme ça:
Comme vous pouvez le constater, cela ne fait aucun doute:
Avec quelques petites retouches et un mappage de couleurs, voici une image de nuage en mosaïque 2x2:
J'espère que cela t'aides!
la source
x*2**o
convertit en C? est-ce:x*pow(2,o)
oupow(x*2,o)
?x*pow(2, o)
, puisque l’exponentiation a une priorité supérieure à la multiplication.a
valeur? et je ne sais pas comment les fonctions sont converties en C ... j’obtiens uniquement des lignes droites en sortie.im.putdata(data, 128, 128)
. (Pour ceux qui ne sont pas familiers avec Python ou PIL: ils signifient échelle et décalage, pas la taille de l'image.)Voici une manière plutôt intelligente d'utiliser le bruit 4D Perlin.
Fondamentalement, mappez la coordonnée X de votre pixel sur un cercle 2D et la coordonnée Y de votre pixel sur un second cercle 2D, puis placez ces deux cercles orthogonaux l'un par rapport à l'autre dans l'espace 4D. La texture obtenue est facile à dorer, ne présente pas de distorsion évidente et ne se répète pas comme le ferait une texture en miroir.
Copier-coller du code de l'article:
la source
OK j'ai compris. La solution consiste à marcher dans un tore dans un bruit 3D, en générant une texture 2D.
Code:
Résultats:
Une fois que:
Et en mosaïque:
la source
Une façon simple de penser serait de prendre la sortie de la fonction de bruit et de l'inverser / la retourner dans une image deux fois plus grande. C'est difficile à expliquer alors voici une image:
Maintenant, dans ce cas, il est assez évident que vous ayez fait cela. Je peux penser à deux façons (éventuellement:) de résoudre ce problème:
Vous pouvez prendre cette image plus grande et ensuite générer un peu plus de bruit, mais (et je ne suis pas sûr que cela soit possible) focalisée vers le milieu (les bords restent donc identiques). Cela pourrait ajouter un peu plus de différence qui ferait penser à votre cerveau que ce n'est pas simplement des images en miroir.
(Je ne suis pas sûr non plus que ce soit possible) Vous pouvez essayer de manipuler les entrées de la fonction de bruit pour générer l'image initiale différemment. Vous devez le faire par essais et erreurs, mais recherchez les caractéristiques qui attirent votre regard lorsque vous le dupliquez / reproduisez-le et que vous essayez ensuite de ne pas générer.
J'espère que cela t'aides.
la source
tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
La première version de cette réponse était en fait fausse, je l'ai mise à jour
Une méthode que j'ai utilisée avec succès est de créer un domaine de bruit en mosaïque. En d’autres termes, définissez votre
noise2()
fonction de base comme périodique. Sinoise2()
est périodique etbeta
entier, le bruit résultant aura la même période quenoise2()
.Comment pouvons-nous faire
noise2()
périodique? Dans la plupart des implémentations, cette fonction utilise une sorte de bruit de réseau. C'est-à-dire qu'il obtient des nombres aléatoires aux coordonnées entières et les interpole. Par exemple:Cette fonction peut être modifiée de manière triviale pour devenir périodique avec une période entière. Ajoutez simplement une ligne:
avant de calculer
v1
etv2
. Ainsi, les valeurs aux coordonnées entières répèteront chaque unité de période et l’interpolation garantira une fonction fluide.Notez cependant que cela ne fonctionne que lorsque Period est supérieur à 1. Donc, pour l'utiliser dans la création de textures homogènes, vous devez échantillonner un carré Period x Period, et non 1x1.
la source
noise2
périodique (avec une période courte telle que 1 unité)? Je pense que c'est ce que la question se pose finalement. Le bruit Perlin standard est périodique avec une période de 256 sur chaque axe, mais vous souhaitez un bruit modifié avec une période plus courte.noise2
comme suggéré, vous allez obtenir des résultats périodiques, si la fonction elle - même est périodique ou non. Parce que les arguments tournent autour de chaque unité.Une autre alternative consiste à générer du bruit à l'aide de bibliothèques libnoise. Vous pouvez générer du bruit de manière transparente sur une quantité d'espace infinie théorique.
Jetez un oeil à ce qui suit: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile
Il existe également un port XNA de ce qui précède à l’ adresse suivante : http://bigblackblock.com/tools/libnoisexna
Si vous utilisez le port XNA, vous pouvez procéder comme suit:
GeneratePlanar est la fonction à appeler pour obtenir les sections dans chaque direction qui se connecteront de manière transparente au reste des textures.
Bien sûr, cette méthode est plus coûteuse que d'avoir simplement une seule texture pouvant être utilisée sur plusieurs surfaces. Si vous cherchez à créer des textures tilables au hasard, cela peut vous intéresser.
la source
Bien que certaines réponses puissent fonctionner, la plupart d’entre elles sont compliquées, lentes et problématiques.
Tout ce que vous avez à faire est d’utiliser une fonction de génération de bruit périodique . C'est ça!
Une excellente implémentation du domaine public basée sur l'algorithme de bruit "avancé" de Perlin peut être trouvée ici . La fonction dont vous avez besoin est pnoise2. Le code a été écrit par Stefan Gustavson, qui a commenté ici précisément ce problème et comment d'autres ont adopté une approche erronée. Écoutez Gustavson, il sait de quoi il parle.
En ce qui concerne les diverses projections sphériques suggérées par certains ici: bien, elles fonctionnent essentiellement (lentement), mais elles produisent également une texture 2D qui est une sphère aplatie, de sorte que les arêtes se condensent davantage, produisant probablement un effet indésirable. Bien sûr, si vous prévoyez pour votre texture 2D à projeter sur une sphère, qui est le chemin à parcourir, mais ce n'est pas ce qui était demandé.
la source
Voici un moyen beaucoup plus simple de faire du bruit en mosaïque:
Vous utilisez un enveloppement modulaire pour chaque échelle de bruit. Celles-ci s'adaptent aux bords de la zone, quelle que soit l'échelle de fréquence utilisée. Il suffit donc d'utiliser un bruit 2D normal, ce qui est beaucoup plus rapide. Voici le code WebGL en direct qui peut être trouvé sur ShaderToy: https://www.shadertoy.com/view/4dlGW2
Les trois fonctions principales effectuent tout le travail et fBM reçoit un vecteur x / y compris entre 0.0 et 1.0.
la source
J'avais des résultats assez mauvais en interpolant près des bords de la mosaïque (bordés), mais cela dépend de l'effet que vous essayez d'obtenir et des paramètres de bruit exacts. Fonctionne très bien pour les bruits quelque peu flous, mais pas si bien avec les épis fins / fins.
la source
Je vérifiais ce fil à la recherche d'une réponse à un problème similaire, puis le développeur de ce code python m'a proposé une solution propre et compacte pour générer du bruit fractal à partir du bruit perlin / simplex. Le code mis à jour est fourni dans ce numéro (fermé) et peut être repris en définissant des gradients pour le côté droit du "générateur" égaux à ceux du côté gauche (et identiques pour les côtés supérieur et inférieur), comme dans
Cela ressemble à une solution élégante et propre, j'évite de copier le code entier ici (car ce n'est pas ma propre solution), mais il est disponible au lien indiqué ci-dessus. J'espère que cela peut être utile à quelqu'un qui cherche à produire une image 2D fractale comme celle dont j'ai besoin, sans artefacts ni distorsions.
la source