Das Verfahren, um Perlin Noise zu erzeugen, wurde 1982 von Ken Perlin für den Film Tron entwickelt. Im Wesentlichen wird dabei ein Ausgangsbild mehrfach vergrössert, zufällig verschoben und dann alle so resultierenden Bilder übereinander belichtet. Während dieses Verfahren mit analogen Bildern aufwändig ist, lässt es sich am Computer leicht umsetzen.

Der Algorithmus besteht aus folgenden Schritten:

  1. Wir beginnen mit einem beliebigen Bild und positionieren dieses auf dem Bildschirm.
    Anfangsbild
  2. Dann vergrössern wir das Bild um 200% (doppelte Länge und Breite, vierfache Fläche) und positionieren es an einer beliebigen Stelle.
    Vergrössertes Bild an beliebiger Position
  3. Das Bild wird auf den Hintergrund abgedruckt (stamp), in der Mitte zentriert und wieder auf eine Grösse von 100% gesetzt. Und für den nächsten Schritt wird eine Kopie des Bildschirms als neues Bild verwendet.

Diese Schritte werden beliebig viele Male wiederholt, so dass am Schluss eine ganze Liste von Bildern mit zunehmend vergrösserten Bildausschnitten zu Verfügung steht.

In Snap! lassen sich diese Schritte mit folgenden Befehlen programmieren:

Algorithmus für Perlin noise

Nach dem mehrmaligen Abarbeiten der zentralen Schritte (hier achtmal), enthält die Variable "layers" mehrere Bilder. Diese Bildserie sieht bei jeder Durchführung etwas anders aus, da ja die einzelnen Bildausschnitte zufällig bestimmt werden.


Die Bilddateien verwenden wir für unseren nächsten Schritt. Jede der Bilddateien besteht aus vielen Zeilen für die RGB-Werte (Rot, Grün, Blau) und den sogenannten Alphakanal (Durchsichtigkeit).


Von alle diesen Werten berechnen wir für jeden Pixel im Bild, d.h. für jede Zeile und letztlich von jeder Zelle, den Durchschnitt über die insgesamt 8 Werte (weil wir den Vorgang achtmal wiederholt haben). Dazu schreiben wir uns einen Block, der den Durchschnitt aus mehreren Werten berechnet.

Block zum Berechnen des Durchschnitts

Das Ergebnis sieht erst einmal nicht besonders spektakulär aus. Im Wesentlichen erhalten wir einfach eine Mehrfachbelichtung von unterschiedlich stark vergrösserten Bildern.

Mehrfach belichtete Bilder

Interessant wird es erst, wenn wir statt eines normalen Fotos ein künstlich erschaffenes Bild als Ausgangslage verwenden, bei dem jeder einzelne Pixel zufällig eingefärbt wird.

Bild mit zufälligen Pixeln

Wenn wir das oben beschriebene Verfahren auf ein solches Bild anwenden, erhalten wir als Resultat den sogenannten Perlin noise, also eine zufällige Verteilung von Farbverläufen über das gesamte Bild hinweg.

Perlin noise aus farbigen Pixeln

Je nachdem, welche und wie viele Lagen wir verwenden, ist die Struktur detaillierter oder weicher gezeichnet. Wenn beispielsweise nur die letzten drei Lagen zu einem Bild verrechnet werden, sieht genau das gleiche Beispiel so aus.


Normalerweise geht man beim Perlin noise jedoch nicht von einem Bild mit farbigen Pixeln aus, sondern beschränkt sich auf Grauwerte. Diese können wir natürlich auch nachträglich noch aus unserem Bild generieren, indem wir nur einen Farbkanal berücksichtigen.

Bild, wenn nur der Rotkanal verwendet wird

Anschliessend könne wir für das Bild Falschfarben einsetzen, indem wir bestimmte Schwellenwerte für die unterschiedlichen Farbkanäle setzen.

Schwellenwerte setzen

Der Rotton wird also nur gerade dann verwendet, wenn der Grauwert zwischen 100 und 110 liegt, der Grünwert entspricht immer dem Grauwert und der Blauwert wird auf 255 gesetzt, wenn der Grauwert kleiner als 100 ist.

Der für den Rotwert verwendete Block ist wie folgt definiert:

Block für Wert zwischen zwei Zahlen

Damit erhalten wir aus dem vorherigen Graubild nun eine Art Landschaft.

Landschaft aus Perlin noise

Wenn wir möchten, können wir auch eine Animation programmieren, bei der der Wasserspiegel steigt und sinkt. Dazu verändern wir die Schwellwerte in einer vorwärts- und einer rückwärtslaufenden for-Schleife.

Schleife für Animation

Landschaft mit sich veränderndem Wasserspiegel

Zuletzt geändert: Mittwoch, 19. Mai 2021, 14:58