Shader-Programmierung 3: Effekte

  • 17Minuten

In den ersten beiden Teilen dieser Serie haben wir sehr viel über Shader gelernt. Neben der Manipulation von Sprites und Post-Processing gibt es aber noch andere Anwendungsmöglichkeiten. Mit Shadern kann man auch bildschirmfüllende Effekte programmieren.

Vorteile und Anwendung

Während wir beim Post-Processing lediglich das manipulieren, was bereits auf dem Bildschirm sichtbar ist, werden wie im dritten Teil ganz neue Inhalte generieren. Der Vorteil, dies mit Shadern zu machen, ist einfach erklärt: Mit Shadern sind Dinge möglich, die sich mit den Mitteln von Game Maker überhaupt nicht, oder nur sehr schwer umsetzen lassen. Die Zeichenfunktionen sind diesbezüglich sehr limitiert und vergleichsweise langsam.

Mandelbrot-Fraktal mit GM-Mitteln

Als Benchmark ein kleiner Test. Das folgende Beispiel zeichnet ein Mandelbrot-Fraktal mit draw_rectangle() auf ein Surface. Es wird im Create-Event vorberechnet und dauert, je nach Prozessor, vergleichsweise lange und sieht dazu noch recht bescheiden aus. Und nicht vergessen: Am Ende haben wir nur einen Frame.

Mandelbrot Fraktal im Game Maker
Mandelbrot Fraktal im Game Maker

Create-Event

Draw-Event

Wie man im Code sehen kann, hat das Fraktal nur eine Größe von 320×200 Pixel – und dauert dennoch recht lange für die Berechnung. Wie flott das im Shader geht, werden wir später sehen.

So weit zu den Vorteilen, aber wozu sind solche Effekte gut? Einerseits, wie so oft in solchen Tutorials, sind sie einfach schön anzusehen. Egal ob Intro, Fake-Cracktro, Hauptmenü oder Credits: Mit solchen Effekten lassen sich Spieler beeindrucken. Doch sie können auch spielrelevant sein. Man muss sich nur mal einen ausgefeilten Tunneleffekt im Hintergrund vorstellen, durch den ein Sprite-Raumschiff fliegt, um nur ein Beispiel zu nennen.

Abgesehen davon kann es extrem Spaß machen – und letztlich geht es genau darum bei der Programmierung.

Projektionsfläche

Es gibt mehrere Möglichkeiten, einen Shader-Effekt auf dem ganzen Bildschirm anzuzeigen. Im Tutorial möchte ich zwei davon zeigen, wobei ich in den Beispielen nur noch die zweite, einfachere Varianten anwenden werde.

Die Vertex-Texture-Methode

In Game Maker gibt es die Funktion draw_vertex_texture(). Sie definiert die Position eines texturierten Scheitelpunktes für ein Primitiv. Zur Verwendung müssen wir zunächst eine Sprite-Textur erstellen, wofür wir die Funktion sprite_get_texture() brauchen. Kurz gesagt: Wir werden eine Textur erstellen, die aus zwei Polygonen besteht. Darauf rendern wir den Shader Effekt.

Zur Verdeutlichung etwas Code:

Der eigentliche Shader-Code fehlt hier, weil ich den Fokus auf die Textur legen möchte. Der Ablauf ist wie folgt:

  1. Wir setzen den Shader.
  2. Wir definieren die Parameter (shader_set_uniform_f() etc.)
  3. Mit sprite_get_texture() wird eine Textur erstellt.
  4. Mit draw_vertex_texture() definieren wir je drei Punkte eines Dreiecks. Das ist unser Polygon. Die beiden Dreiecke ergeben ein Rechteck.
  5. Das Zeichnen wird mit draw_primitive_end() und shader_reset() beendet.

Viel Aufwand für wenig Effekt?

Tatsächlich ist es mehr Code, als die Methode, die gleich gezeigt wird. Sie ist wahrscheinlich auch etwas langsamer. Der Vorteil ist, dass man den Effekt mit dieser Methode etwas besser kontrollieren kann. Man kann Größe und Position zur Laufzeit ganz einfach ändern. Wenn man das Rechteck in viele weitere Polygone unterteilt, kann man so einen Effekt auch auf kreative Weise ein- und ausblenden.

Außerdem haben wir so einmal mit einer Textur gearbeitet, was man vor allem im 3D-Bereich gut gebrauchen kann.

Die Surface-Methode

Wer die ersten beiden Teile bereits durchgearbeitet hat, dem wird dies vertraut vorkommen.

Das sieht schon etwas unkomplizierter aus. Wir setzen unseren Shader, stellen die Parameter ein (nicht im Beispiel enthalten) und zeichnen, wie gewohnt, mit draw_surface_ext() eine Oberfläche. Für die meisten vollflächigen Effekte sollte das ausreichen.

Auf den nachfolgenden Seiten möchte ich einige praktische Beispiele zeigen. Dabei zeige ich den Code für Create- sowie Draw-Event und natürlich den Fragment-Shader. Das erste Beispiel betrifft Plasma-Effekte, wie man sie aus Demos der frühen 1990er Jahre kennt. Das allererste Beispiel zeigt die Vertex-Texture-Methode, alle weiteren Beispiele die Surface-Methode.

Autor

Abonnieren
Benachrichtige mich bei
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x