Question

Je me suis intéressé (comme amateur) dans la génération de bruit pseudo-aléatoire, plus précisément les algorithmes et Perlin Simplex. L'avantage de Simplex est la vitesse (en particulier à des dimensions plus élevées), mais Perlin peut être carrelée relativement facilement. Je me demandais si quelqu'un était au courant d'un algorithme simplex de carrelage? mieux dimension fixe est bien, générique est; pseudocode est bien, c / c ++ est mieux.

Était-ce utile?

La solution 3

Il semblerait que cette question a été raisonnablement résolu , avec une description détaillée de l'idée derrière la solution de travail

Autres conseils

Il suffit de tuiles votre bruit de la même façon que vous le feriez dans Perlin seulement le faire après l'inclinaison. Vous pouvez le faire en modifiant la partie qui obtient les permutaions pour faire le 256 mod (ou & 255, tout ce que vous utilisez) après (au lieu d'avant) que vous ajoutez à des compensations pour les obtenir les autres coins du coin de base. Ceci est le bit modifié du code HLSL:

uint3 iIdx0 = p0SI % 256;
uint3 iIdx1 = (p0SI + pI1) % 256;
uint3 iIdx2 = (p0SI + pI2) % 256;
uint3 iIdx3 = (p0SI + 1.0f) % 256;
uint iGI0 = gPerm[ iIdx0.x + gPerm[ iIdx0.y + gPerm[ iIdx0.z ] ] ] % 12;
uint iGI1 = gPerm[ iIdx1.x + gPerm[ iIdx1.y + gPerm[ iIdx1.z ] ] ] % 12;
uint iGI2 = gPerm[ iIdx2.x + gPerm[ iIdx2.y + gPerm[ iIdx2.z ] ] ] % 12;
uint iGI3 = gPerm[ iIdx3.x + gPerm[ iIdx3.y + gPerm[ iIdx3.z ] ] ] % 12;

p0SI est l'angle 0 et le point PI2 et PI2 sont des vecteurs à coin et un coin deux calculés de la manière habituelle. Notez que dans HLSL à promouvoir scalaires des vecteurs automatiquement operatons mixtes afin, par exemple, est en fait 1.0f (1.0,1.0,1.0). Je viens de comprendre ce Stuf carrelage mais sur apprently il fonctionne. Si vous avez besoin à l'ombre d'une grande planète ou merde, mais seulement avoir une précision unique sur votre carte il y a quelques étapes. Battez moi.

Edit: vous savez après y avoir réfléchi un peu plus, je ne pense pas que vous devez changer quoi que ce soit. Je pense que carreaux autmatically à 256 unités en œuvre.

Même si quelques années ont passé, cette question est toujours parmi les meilleurs résultats sur Google.

Dans le bruit simplex, x et y d'une grille droite (ortonormal) obtenir biaisé pour trouver le simplex point est (un triangle en 2D), donc avec des techniques de carrelage communes (% 255 ou autre), il ne tuile, mais les tuiles sur les coordonnées faussés, qui est-il tuiles « en diagonale », ce qui est tout à fait inutile.

Une solution simple que j'ai trouvé est de « non-skew » le résultat, de sorte que d'origine X et Y sont d'abord biaisés « à gauche », alors l'algorithme leur biaiser « à droite », et la finale résultat sera ré-aligné sur une grille non biaisée.

Si, par exemple, votre implémentation simplex est similaire à SimplexNoise.java vous pouvez trouver partout sur le net, il biaise la grille en utilisant:

var F2 = 0.5*(Math.sqrt(3.0)-1.0);
var s = (xin+yin)*F2; // Hairy factor for 2D
var i = Math.floor(xin+s);
var j = Math.floor(yin+s);

Vous pouvez simplement « pré-skew » dans le sens opposé au point d'entrée de la méthode:

var G2 = (3.0-Math.sqrt(3.0))/6.0;
var t = (xin+yin)*G2;
xin-=t;
yin-=t;

Malheureusement, il produit un effet quelque peu étrange prospectifs (qui est, il semble un peu biaisé: D), qui ne sont généralement pas un problème, mais dépend de ce que vous avez besoin que pour le bruit

.

Comme il était un problème pour moi, je l'ai essayé d'appliquer cette « inverse désalignement » seulement à deux octaves, ceux qui poids plus dans la sortie finale, et au lieu utilisé interpolation pour « plus légères » octaves. Cette solution m'a donné carrelage satisfaisant basé sur simplex bruit de Perlin, interpolation cause sur tous les octaves produirait une atténuation trop élevée sur les frontières de tuiles, et quand plus octaves sont ajoutés sans artificielle biaiser l'effet strage prospectifs croule sous le bruit supplémentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top