Domanda

Mi sono interessato (come hobbista) nella generazione di rumore pseudo-casuale, in particolare gli algoritmi Perlin e Simplex. Il vantaggio di Simplex è la velocità (soprattutto di dimensioni superiori), ma può essere piastrellata Perlin relativamente facilmente. Mi chiedevo se qualcuno era a conoscenza di un algoritmo di piastrelle simplex? Fisso-dimensione è bene, generico è migliore; pseudocodice va bene, C / C ++ è meglio.

È stato utile?

Soluzione 3

Sembrerebbe questa domanda è stata ragionevolmente risolto qui , con una descrizione dettagliata dell'idea dietro la soluzione di lavoro qui . Una fantastica risposta a un problema di lunga data!

Altri suggerimenti

Basta piastrelle tua rumore nello stesso modo si farebbe in Perlin farlo solo dopo l'inclinazione. È possibile farlo modificando la parte che ottiene il permutaions per fare il mod 256 (o 255 e, qualunque cosa si sta utilizzando) dopo (al posto di prima) si aggiunge agli offset ottenere gli altri angoli da un angolo di base. Questo è il bit modificata del codice 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 è il punto d'angolo 0 e PI2 e PI2 sono vettori ad angolo uno e angolo 2 calcolati nel modo consueto. Si noti che in HLSL scalari promuovono a vettori automaticamente operatons misti così per esempio 1.0f è in realtà (1.0,1.0,1.0). Ho solo pensato che questo piastrelle stuf fuori ma apprently funziona. Se avete bisogno di ombra a un grande pianeta o un po 'di merda, ma hanno solo singola precisione sulla carta ci sono ancora qualche passo. Mi ha colpito.

Modifica: si sa dopo averci pensato un po 'io non penso che si debba cambiare nulla. Penso che le piastrelle autmatically a 256 unità attuato.

Anche se pochi anni passati, questa domanda è ancora tra i migliori risultati su Google.

In simplex rumore, x ed y da una retta (ortonormali) griglia arrivare distorta per trovare il simplex il punto è in (a triangolo in 2D), quindi con tecniche comuni piastrelle (% 255 o altro), esso viene affiancata, ma piastrelle su coordinate inclinate, che è esso le piastrelle "in diagonale", che è del tutto inutile.

Una soluzione semplice che ho trovato è quello di "non-skew" il risultato, in modo che X e Y sono originali falsati prima "a sinistra", allora l'algoritmo li inclinare "a destra", e la finale risultato verrà nuovamente allineata ad una griglia non distorta.

Se, ad esempio, l'implementazione simplex è simile a SimplexNoise.java si possono trovare ovunque in rete, si distorce la griglia utilizzando:

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);

Si può semplicemente "pre-skew" nella direzione opposta al punto di ingresso del metodo:

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

Purtroppo, produce un qualche modo dall'aspetto strano effetto (cioè, sembra un po 'distorta: D), che di solito non è un problema, ma dipende da ciò che è necessario che il rumore per

.

Dato che era un problema per me, ho provato ad applicare questa "inversa-inclinazione" solo per un paio di ottave, quelli che il peso maggiore nell'output finale, e invece di interpolazione utilizzati per ottave più "leggero". Questa soluzione mi ha dato piastrelle soddisfacente sulla base di simplex disturbo Perlin, causa interpolazione su tutte le ottave produrrebbe troppo attenuazione sui confini di piastrelle, e quando più ottave vengono aggiunti senza artificiale inclinare l'effetto strage dall'aspetto viene sepolto sotto il rumore aggiuntivo.

Di recente ho bisogno di piastrellatura rumore simplex e sono imbattuto in questa domanda.

Per la piastrellatura rumore utilizzando qualsiasi funzione di rumore, è possibile linearmente interpolare i campioni di piastrelle supplementari:

Ftileable(x, y) = ( 
       F(x, y) * (w - x) * (h - y) + 
       F(x - w, y) * (x) * (h - y) + 
       F(x - w, y - h) * (x) * (y) + 
       F(x, y - h) * (w - x) * (y)
) / (wh)

dove F () è la funzione del rumore. Si noti che x, y devono essere coordinate all'interno di una singola piastrella: x in [0, w), y [0, h). Si potrebbe usare qualcosa come Tilex = x -. Math.floor (x / w) * w o fmod ()

Se le prestazioni sono critiche o per dimensioni superiori, questo non può essere la strada da percorrere perché richiede 2 ricerche ^ D per dimensione D. inoltre prodotto valori inferiori verso i centri di piastrelle per me.

Tratto da: http: //webstaff.itn .liu.se / ~ stegu / TNM022-2005 / perlinnoiselinks / Perlin-noise-math-faq.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top