• 4Minuten
blank

Mitte der 1990er Jahre entstand in der Demoszene ein wunderschöner Effekt, den man “2D Blobs” nannte. Er wirkt, wie tanzende Wassertropfen auf einer Scheibe, die sich immer wieder vereinen und anschließend trennen. Diesen Effekt können wir als Shader in GameMaker Studio nachprogrammieren.

Der Effekt sieht so aus:

Du kannst bei den 2D-Blobs im Prinzip alles anpassen. In meiner kleinen Demo “NO RUST” gibt es einen ähnlichen Effekt, der aber etwas simpler gestrickt ist.

Das Prinzip

Die Idee hinter den Blobs basiert auf der Metaball-Technik. Dies ist eine Methode, um weiche, organische Formen zu erzeugen, die miteinander verschmelzen können.

Stell Dir vor, jeder Blob ist wie ein kleiner “Magnet”, der eine Kraft ausstrahlt. Diese Kraft ist in der Mitte des Blobs am stärksten und wird schwächer, je weiter Du davon weg bist. Wenn Du mehrere dieser Blobs hast, summieren sich ihre Kräfte in der Nähe zueinander.

Wenn zwei Blobs nahe genug beieinander sind, addieren sich ihre Kräfte. Dadurch sieht es so aus, als würden sie miteinander verschmelzen und eine größere Form bilden.

Im Grunde genommen funktioniert die Metaball-Technik so: Jeder Blob beeinflusst die Umgebung um sich herum. Wenn die “Kraft” eines oder mehrerer Blobs an einem Punkt auf dem Bildschirm stark genug ist, siehst Du dort die Form des Blobs. Andernfalls bleibt der Bereich unsichtbar oder leer.

Das Ergebnis sind glatte, organisch wirkende Formen, die wie Tropfen aussehen, die zusammenlaufen, wenn sie sich nahekommen.

Diese Technik verwendet eine Funktion (in unserem Fall die meta()-Funktion), die für jeden Punkt auf dem Bildschirm die Entfernung zu einem Blob berechnet.

Jeder Blob hat eine gewisse “Kraft” oder “Einfluss” auf die Pixel um sich herum. Diese Kraft nimmt mit der Entfernung ab, was durch die Division des Blob-Radius durch die Entfernung (kRadius / d(p, b)) erreicht wird.

Bewegung der 2D-Blobs

Die Bewegung der 2D-Blobs wird durch eine Kombination von Sinus- und Cosinus-Funktionen realisiert. Das ergibt eine fließende, oszillierende Bewegung in alle Richtungen. Die Zeitvariable time sorgt dafür, dass die 2D-Blobs animiert sind und sich dynamisch im Raum bewegen.

Jede Blob-Position wird durch eine individuelle Berechnung festgelegt, die von der Zeit abhängt. Dadurch bewegen sich alle Blobs auf unterschiedliche Art und Weise, was das Bild lebendiger macht.

Farbverlauf

Für den Farbverlauf der Blobs wird die mix()-Funktion verwendet, um eine Mischung zwischen zwei Farben (im Beispiel Gold und Orange) zu erzeugen. Diese Mischung hängt von der Blob-“Intensität” ab, die sich nach der Nähe des Pixels zum Blob-Zentrum richtet.

In der Nähe des Blob-Kerns ist die Intensität hoch, wodurch eine goldene Farbe entsteht, während an den Rändern die Intensität abnimmt und die Farbe zu Orange wechselt.

Farbmischung und Hintergrund

Der Hintergrund ist ein dunkler Farbton (#4C4A4B), der einen guten Kontrast zu den leuchtenden Blobs bietet. Du kannst ihn ändern oder – über das GM-Objekt – sogar ein Bild verwenden.

Schließlich wird die Blob-Farbe mithilfe der mix()-Funktion mit dem Hintergrund gemischt, um eine weiche Kante und Übergänge zu erzeugen.

Shader sh_2d_blobs

Nach so viel Theorie kommen wir endlich zum Code. Da die Berechnungen ein wenig komplexer sind als sonst, habe ich ihn detaillierter kommentiert.

Objekt o_2d_blobs

Natürlich brauchen wir noch ein Objekt, um den Effekt einzubinden. Außerdem brauchen wir zwei Events im Objekt.

Even Create

Event Draw

Wir projizieren den Effekt auf ein Rechteck, könnten aber auch eine andere Form oder gar einen Sprite verwenden.

Das war es auch schon wieder. Nun kannst Du den Effekt nach Deinen Vorstellungen anpassen.

Weiterführende Links

Shader-Programmierung 1: Grundlagen und Sprites
Shader-Effekt: Tunnel mit Maussteuerung
Shader-Effekt: CRT
Bildeinblendung per Shader
GameMaker Quicktipp: Probleme mit Shaderunterstützung

Autor

Abonnieren
Benachrichtige mich bei
guest

0 Comments
Älteste
Neueste Meistgewählt
Inline Feedbacks
Alle Kommentare anzeigen