Was ist Shadertoy?
Shadertoy ist eine englischsprachige Programmierumgebung für sogenannte Shader. Rechts schreibt man ein Programm in der Sprache GLSL, das dann direkt auf der Grafikkarte von der Shader-Kernen der GPU ausgeführt wird und links sieht man gleich, was es tut.
Für Programmierer ist es wirklich wie ein Spiel: Schreibe ein Programm, was in einer Sandbox läuft. Von außen bekommst du Werte für Auflösung, abgelaufene Zeit und die Koordinate des zu berechnenden Fragments (Pixels) eines Frames. Die Funktion soll den Farbwert dieses Pixels berechnen. Und nicht nur den: Die Grafikkarte führt diese Funktion für jedes Pixel eines Frames aus, bis alle Pixel berechnet wurden und das Frame fertig ist. Das passiert 60-mal in der Sekunde.
Also geht es um Bilderzeugung allein mit Mathematik und darum, seine Erfahrung und den Code zu teilen. Das macht wirklich Spaß, zumindest wenn man sich wie ich an Programmierung und Mathematik erfreuen kann.
Doch wie errechnet man anhand der Pixelkoordinate eine Farbe und warum und vor allem wie können alle Pixel gleichzeitig errechnet werden?
Für den Anfang
Das »Book Of Shaders« setzt hier an und erklärt in einfacher Sprache und Handzeichnungen, wie das Ganze im Grunde funktioniert.
Youtube-Video »Lean to Paint with Mathematics« von iq ist eine gute Einführung in das Tool Shadertoy und FabriceNeyret2 zeigt auf seinem Blog Shadertoy Unofficial, was damit alles möglich ist. Vorweg: Grafisch ist alles möglich!
Nachdem etwa eine Woche vergangen war ließ mich das Thema nicht mehr los und es kribbelte in den Fingern. Ich meldete mich als Svenofnine dort an.
Bei den Programmiersprachen, mit welchen ich mich bisher beschäftigt habe, gab es immer Referenzen der Funktionen, Variablen und Operatoren. Bei Shadertoy hatte es eine Weile gedauert, bis ich auf dieses kleine Fragezeichen rechts unten am Rand des Texteditors entdeckte. Klickt man da drauf, gibt es direkt von Shadertoy das Wichtigste auf einer Seite.
Oben am Editor gibt es die »Shader Inputs«. Das sind sogenannte uniforme Variablen, welche für zu berechnenden Pixel konstant sind und zur Verfügung stehen.
Es gibt neben den bekannten Datentypen float (Fließkomma-Zahl) und int (Ganzzahl) noch verschiedene Vektor‑, Matrix- und Buffer-Datentypen, die auch auf der Hardware der Grafikkarte unterstützt werden.
Dieser Blog-Post soll ja kein Tutorial sein, weil ich da ja selbst ganz am Anfang stehe und es viele Ressourcen dafür gibt. Ich versuche, soweit es geht, meinen Code zu kommentieren und Fragen zu beantworten.
Hier sind noch weitere Links zum Thema:
- inspirnathan.com — Shadertoy Tutorial Part 1 — Intro
- Into Shadertoy and Shaders useful links and tips
- OpenGL Shading Language (GLSL) Quick Reference (PDF)