Verbunden:
Ich möchte kachelbares Perlin-Rauschen erzeugen. Ich arbeite von Paul Bourkes PerlinNoise*()
Funktionen aus, die so aussehen:
// 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);
}
Verwenden Sie Code wie:
real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test
return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;
Gibt Himmel wie
Welches ist nicht kachelbar.
Die Pixelwerte sind 0 -> 256 (Breite und Höhe) und Pixel (0,0) verwendet (x, y) = (0,0) und Pixel (256,256) verwendet (x, y) = (1,1).
Wie kann ich es fliesbar machen?
tiles
perlin-noise
Bobobobo
quelle
quelle
Antworten:
Es gibt zwei Teile, um fBm-Rauschen wie dieses nahtlos zu kacheln. Zunächst müssen Sie die Perlin-Rauschfunktion selbst kachelbar machen. Hier ist ein Python-Code für eine einfache Perlin-Rauschfunktion, die mit einer beliebigen Periode bis zu 256 arbeitet (Sie können sie beliebig erweitern, indem Sie den ersten Abschnitt ändern):
Perlin-Rauschen wird aus einer Summe kleiner "Surflets" erzeugt, die das Produkt eines zufällig orientierten Gradienten und einer trennbaren Polynom-Falloff-Funktion sind. Dies ergibt einen positiven Bereich (gelb) und einen negativen Bereich (blau).
Die Surflets haben eine Ausdehnung von 2 × 2 und sind auf die ganzzahligen Gitterpunkte zentriert, sodass der Wert des Perlin-Rauschens an jedem Punkt im Raum durch Summieren der Surflets an den Ecken der Zelle, die sie einnehmen, erzeugt wird.
Wenn Sie die Verlaufsrichtungen mit einer bestimmten Periode umbrechen lassen, wird das Rauschen selbst nahtlos mit derselben Periode umbrochen. Aus diesem Grund nimmt der obige Code das Gitterkoordinatenmodul für die Periode, bevor es durch die Permutationstabelle gehasht wird.
Der andere Schritt ist, dass Sie beim Summieren der Oktaven die Periode mit der Frequenz der Oktave skalieren möchten. Im Wesentlichen soll jede Oktave das gesamte gerade Bild einmal und nicht mehrmals kacheln:
Füge das zusammen und du bekommst so etwas:
Wie Sie sehen können, funktioniert dies in der Tat nahtlos:
Mit einigen kleinen Optimierungen und Farbzuordnungen ist hier ein Wolkenbild, das 2x2 gekachelt ist:
Hoffe das hilft!
quelle
x*2**o
konvertiert man nach C? ist es:x*pow(2,o)
oderpow(x*2,o)
?x*pow(2, o)
, da die Potenzierung Vorrang vor der Multiplikation hat.a
Wert? und ich bin nicht sicher, wie die Funktionen in C konvertieren ... Ich bekomme nur gerade Linien in der Ausgabe.im.putdata(data, 128, 128)
. (Für diejenigen, die nicht mit Python oder PIL vertraut sind: sie bedeuten Skalierung und Versatz, nicht Bildgröße.)Hier ist eine ziemlich clevere Methode, die 4D Perlin-Rauschen verwendet.
Ordnen Sie im Allgemeinen die X-Koordinate Ihres Pixels einem 2D-Kreis und die Y-Koordinate Ihres Pixels einem zweiten 2D-Kreis zu und platzieren Sie diese beiden Kreise orthogonal zueinander im 4D-Raum. Die resultierende Textur ist kachelbar, weist keine offensichtlichen Verzerrungen auf und wiederholt sich nicht wie eine gespiegelte Textur.
Kopieren und Einfügen von Code aus dem Artikel:
quelle
OK ich habe es. Die Antwort ist, in einem Torus in 3D-Rauschen zu laufen und daraus eine 2D-Textur zu erzeugen.
Code:
Ergebnisse:
Einmal:
Und gekachelt:
quelle
Ein einfacher Weg, den ich mir vorstellen kann, wäre, die Ausgabe der Rauschfunktion zu nehmen und sie in ein Bild zu spiegeln / zu spiegeln, das doppelt so groß ist. Es ist schwer zu erklären, daher hier ein Bild:
In diesem Fall ist es ziemlich offensichtlich, was Sie getan haben, als Sie sich das anschauten. Ich kann mir zwei Möglichkeiten vorstellen, dies (möglicherweise :-)) zu lösen:
Sie könnten das größere Bild aufnehmen und dann etwas mehr Rauschen darüber erzeugen, aber (und ich bin mir nicht sicher, ob dies möglich ist) auf die Mitte fokussieren (damit die Ränder gleich bleiben). Es könnte den zusätzlichen Unterschied hinzufügen, der Ihr Gehirn denken lässt, dass es sich nicht nur um Spiegelbilder handelt.
(Ich bin mir auch nicht sicher, ob dies möglich ist.) Sie können versuchen, mit den Eingaben für die Rauschfunktion zu experimentieren, um das ursprüngliche Bild anders zu erzeugen. Sie müssten dies durch Ausprobieren tun, aber suchen Sie nach Funktionen, die Ihre Aufmerksamkeit auf sich ziehen, wenn Sie sie kacheln / spiegeln, und versuchen Sie dann, sie nicht zu generieren.
Hoffe das hilft.
quelle
tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
Die erste Version dieser Antwort war tatsächlich falsch. Ich habe sie aktualisiert
Ein Verfahren verwenden I ist erfolgreich Lärm Domain gefliest. Mit anderen Worten, machen Sie Ihre
noise2()
Basisfunktion periodisch. Wennnoise2()
periodisch undbeta
ganzzahlig ist, hat das resultierende Rauschen die gleiche Periode wienoise2()
.Wie können wir
noise2()
periodisch machen ? In den meisten Implementierungen verwendet diese Funktion eine Art Gitterrauschen. Das heißt, es werden Zufallszahlen an ganzzahligen Koordinaten abgerufen und interpoliert. Zum Beispiel:Diese Funktion kann trivial modifiziert werden, um mit einer ganzzahligen Periode periodisch zu werden. Fügen Sie einfach eine Zeile hinzu:
vor der Berechnung
v1
undv2
. Auf diese Weise werden Werte an ganzzahligen Koordinaten alle Periodeneinheiten wiederholt, und durch Interpolation wird sichergestellt, dass die resultierende Funktion reibungslos ist.Beachten Sie jedoch, dass dies nur funktioniert, wenn die Periode größer als 1 ist. Wenn Sie dies also für die Erstellung nahtloser Texturen verwenden möchten, müssen Sie ein Quadrat aus Periode x Periode und nicht 1x1 abtasten.
quelle
noise2
periodisch (mit einer kurzen Periode wie 1 Einheit)? Ich denke, das ist die Frage, die sich letztendlich stellt. Standard-Perlin-Rauschen ist periodisch mit einer Periode von 256 auf jeder Achse, Sie möchten jedoch ein modifiziertes Rauschen mit einer kleineren Periode.noise2
wie vorgeschlagen, Sie werden regelmäßig Ergebnisse erhalten, ob die Funktion selbst periodisch ist oder nicht. Weil sich die Argumente um jede Einheit drehen.Eine andere Alternative besteht darin, mit libnoise-Bibliotheken Rauschen zu erzeugen. Sie können nahtlos über eine theoretisch unendliche Menge an Raum Rauschen erzeugen.
Schauen Sie sich Folgendes an: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile
Es gibt auch einen XNA-Port für das oben Genannte unter : http://bigblackblock.com/tools/libnoisexna
Wenn Sie am Ende den XNA-Port verwenden, können Sie Folgendes tun:
GeneratePlanar ist die Funktion, die aufgerufen wird, um die Abschnitte in jeder Richtung abzurufen, die sich nahtlos mit den übrigen Texturen verbinden.
Natürlich ist diese Methode teurer als nur eine einzige Textur, die über mehrere Oberflächen hinweg verwendet werden kann. Wenn Sie nach zufälligen kachelbaren Texturen suchen, könnte dies für Sie von Interesse sein.
quelle
Obwohl es hier einige Antworten gibt, die funktionieren würden, sind die meisten kompliziert, langsam und problematisch.
Alles, was Sie wirklich tun müssen, ist die Verwendung einer Funktion zur periodischen Geräuscherzeugung. Das ist es!
Eine exzellente Public Domain-Implementierung basierend auf Perlins "fortgeschrittenem" Rauschalgorithmus finden Sie hier . Die Funktion, die Sie benötigen, ist pnoise2. Der Code wurde von Stefan Gustavson geschrieben, der genau zu diesem Thema hier einen spitzen Kommentar abgegeben hat und wie andere den falschen Ansatz gewählt haben. Hör Gustavson zu, er weiß wovon er spricht.
In Bezug auf die verschiedenen sphärischen Projektionen haben einige angedeutet: Nun, sie funktionieren im Wesentlichen (langsam), aber sie erzeugen auch eine 2D-Textur, die eine abgeflachte Kugel ist, so dass die Kanten stärker verdichtet würden, was wahrscheinlich einen unerwünschten Effekt hervorruft. Wenn Sie beabsichtigen, Ihre 2D-Textur auf eine Kugel zu projizieren, ist dies natürlich der richtige Weg, aber danach wurde nicht gefragt.
quelle
Hier ist eine viel einfachere Möglichkeit, gekachelte Geräusche zu erzeugen:
Sie verwenden einen modularen Umgriff für jede Skala des Geräusches. Diese passen sich den Rändern des Bereichs an, unabhängig davon, welche Frequenzskala Sie verwenden. Sie müssen also nur normales 2D-Rauschen verwenden, das viel schneller ist. Hier ist der Live-WebGL-Code, der unter ShaderToy zu finden ist: https://www.shadertoy.com/view/4dlGW2
Die drei obersten Funktionen erledigen die gesamte Arbeit, und fBM wird ein Vektor x / y in einem Bereich von 0,0 bis 1,0 übergeben.
quelle
Ich hatte einige nicht schlechte Ergebnisse bei der Interpolation in der Nähe der Kanten der Kachel (kantenumwickelt), aber es hängt davon ab, welchen Effekt Sie erzielen möchten und welche genauen Rauschparameter vorliegen. Funktioniert hervorragend bei etwas verschwommenen Geräuschen, nicht so gut bei spitzen / feinkörnigen.
quelle
Ich habe diesen Thread auf der Suche nach einer Antwort auf ein ähnliches Problem überprüft und dann vom Entwickler dieses Python-Codes eine saubere und kompakte Lösung zur Erzeugung von fraktalem Rauschen aus Perlin / Simplex-Rauschen erhalten. Der aktualisierte Code ist in dieser (abgeschlossenen) Ausgabe enthalten und kann fortgesetzt werden, indem die Farbverläufe für die rechte Seite des "Generators" mit denen auf der linken Seite (und für oben und unten) gleichgesetzt werden, z. B. in
Scheint eine elegante und saubere Lösung zu sein, ich vermeide es, den gesamten Code hier zu kopieren (da es nicht meine eigene Lösung ist), aber sie ist unter dem oben angegebenen Link verfügbar. Hoffe, dass dies für jemanden nützlich sein kann, der ein kachelbares fraktales 2D-Bild wie das von mir benötigte ohne Artefakte oder Verzerrungen erstellen möchte.
quelle