Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Konvertierung von GLSL in Godot-Shader
Dieses Dokument erklärt die Unterschiede zwischen Godots Shader-Sprache und GLSL und gibt praktische Ratschläge zur Migration von Shadern aus anderen Quellen wie Shadertoy und The Book of Shaders in Godot-Shader.
Genauere Informationen über Godots Shader-Sprache gibt es im eigenen Artikel: Shading Language.
GLSL
Godot verwendet eine auf GLSL basierende Shader-Sprache mit einigen verbesserten Funktionen. Dementsprechend sind die meisten in GLSL verfügbaren Funktionen in Godots Shader-Sprache verfügbar.
Shader-Programme
In GLSL verwendet jeder Shader ein separates Programm. Sie haben ein Programm für den Vertex-Shader und eines für den Fragment-Shader. In Godot haben Sie einen einzelnen Shader, der eine vertex - und/oder eine fragment-Funktion enthält. Wenn Sie nur eines schreiben, liefert Godot das andere.
Mit Godot können einheitliche Variablen und Funktionen gemeinsam genutzt werden, indem die Fragment- und Vertex-Shader in einer Datei definiert werden. In GLSL können die Vertex- und Fragment-Programme nur dann Variablen gemeinsam nutzen, wenn Varyings verwendet werden.
Vertex-Attribute
In GLSL können Sie Informationen pro Vertex mit Hilfe von Attributen eingeben und haben die Flexibilität, so viel oder so wenig einzugeben, wie Sie möchten. In Godot haben Sie eine bestimmte Anzahl von Eingabeattributen, einschließlich VERTEX (Position), COLOR, UV, UV2, NORMAL. Die Seite jedes Shaders im Abschnitt Shader-Referenz der Dokumentation enthält eine vollständige Liste der Vertex-Attribute.
gl_Position
gl_Position empfängt die Endposition eines im Vertex-Shader spezifizierten Vertexes. Sie wird vom Benutzer im Clip-Space angegeben. Typischerweise wird in GLSL die Position eines Vertexes im Model-Space mit einem Vertex-Attribut namens Position übergeben, und die Konvertierung vom Model-Space in den Clip-Space wird manuell vorgenommen.
In Godot spezifiziert VERTEX die Position des Vertex im Model Space zu Beginn der Vertex-Funktion. Godot kümmert sich auch um die endgültige Konvertierung in den Clip Space, nachdem die benutzerdefinierte Vertex Funktion ausgeführt wurde. Wenn Sie die Umwandlung vom Model in den View Space überspringen wollen, können Sie den render_mode auf skip_vertex_transform setzen. Wenn Sie alle Transformationen überspringen wollen, setzen Sie render_mode auf skip_vertex_transform und setzen Sie den PROJECTION_MATRIX auf mat4(1.0), um die endgültige Transformation vom View Space zum Clip Space aufzuheben.
Varyings
Varyings sind ein Typ von Variablen, die vom Vertex-Shader an den Fragment-Shader weitergegeben werden können. In modernem GLSL (3.0 und höher) werden Varyings mit den Schlüsselwörtern in und out definiert. Eine Variable, die den Vertex-Shader verlässt, wird mit out im Vertex-Shader und in im Fragment-Shader definiert.
Main
In GLSL sieht jedes Shader-Programm wie ein in sich geschlossenes Programm im C-Stil aus. Dementsprechend ist der Haupteinstiegspunkt main. Wenn Sie einen Vertex-Shader kopieren, benennen Sie main in vertex um und wenn Sie einen Fragment-Shader kopieren, benennen Sie main in fragment um.
Makros
Der Godot-Shader-Präprozessor unterstützt die folgenden Makros:
#define/#undef#if,#elif,#else,#endif,defined(),#ifdef,#ifndef#include(nur.gdshaderinc-Dateien und mit einer maximalen Tiefe von 25)#pragma disable_preprocessor, das die Vorverarbeitung für den Rest der Datei deaktiviert
Variablen
GLSL verfügt über viele Built-in-Variablen, die hartcodiert sind. Diese Variablen sind keine Uniforms, daher können sie nicht vom Hauptprogramm aus bearbeitet werden.
Variable |
Typ |
Äquivalent |
Beschreibung |
|---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
Ausgabefarbe für jedes Pixel. |
gl_FragCoord |
vec4 |
FRAGCOORD |
Für Vollbild-Quads. Verwenden Sie für kleinere Quads UV. |
gl_Position |
vec4 |
VERTEX |
Position des Vertex, Ausgabe des Vertex-Shaders. |
gl_PointSize |
float |
POINT_SIZE |
Größe des Punkt-Primitivs. |
gl_PointCoord |
vec2 |
POINT_COORD |
Position auf Punkt beim Zeichnen von Punktprimitiven. |
gl_FrontFacing |
bool |
FRONT_FACING |
true, wenn es die Vorderseite des Primitivs ist. |
Koordinaten
gl_FragCoord in GLSL und FRAGCOORD in der Godot Shading Language benutzen das gleiche Koordinatensystem. Wenn man UV in Godot benutzt, wird die y-Koordinate auf den Kopf gestellt.
Präzision
In GLSL können Sie die Präzision eines bestimmten Typs (float oder int) am Anfang des Shaders mit dem Schlüsselwort precision definieren. In Godot können Sie die Präzision einzelner Variablen nach Bedarf einstellen, indem Sie bei der Definition der Variablen die Präzisionsqualifier lowp, mediump und highp vor den Typ setzen. Weitere Informationen finden Sie in der Shading Language-Referenz.
Shadertoy
Shadertoy ist eine Website, die es einfach macht, Fragment-Shader zu schreiben und pure Magie zu erzeugen.
Shadertoy gibt dem Benutzer nicht die volle Kontrolle über den Shader. Es behandelt alle Eingaben und Uniforms und lässt den Benutzer nur den Fragment-Shader schreiben.
Typen
Shadertoy verwendet die webgl-Spezifikation, so dass es eine etwas andere Version von GLSL verwendet. Es hat jedoch immer noch die regulären Typen, einschließlich Konstanten und Makros.
mainImage
Der Haupteinstiegspunkt in einen Shadertoy-Shader ist die Funktion mainImage. mainImage hat zwei Parameter, fragColor und fragCoord, die COLOR bzw. FRAGCOORD in Godot entsprechen. Diese Parameter werden in Godot automatisch gehandhabt, so dass Sie sie nicht selbst als Parameter angeben müssen. Alles, was in der Funktion mainImage steht, sollte bei der Portierung nach Godot in die Funktion fragment kopiert werden.
Variablen
Um das Schreiben von Fragment-Shadern einfach und unkompliziert zu gestalten, übernimmt Shadertoy die Übergabe vieler hilfreicher Informationen aus dem Hauptprogramm an den Fragment-Shader für Sie. Einige von ihnen haben keine Entsprechung in Godot, weil Godot sich entschieden hat, sie nicht standardmäßig verfügbar zu machen. Das ist in Ordnung, denn Godot gibt Ihnen die Möglichkeit, Ihre eigenen Uniforms zu erstellen. Für Variablen, deren Äquivalente als "Mit Uniform angeben" aufgeführt sind, sind die Benutzer selbst für die Erstellung dieser Uniforms verantwortlich. Die Beschreibung gibt dem Leser einen Hinweis darauf, was er als Ersatz angeben kann.
Variable |
Typ |
Äquivalent |
Beschreibung |
|---|---|---|---|
fragColor |
out vec4 |
COLOR |
Ausgabefarbe für jedes Pixel. |
fragCoord |
vec2 |
FRAGCOORD.xy |
Für Vollbild-Quads. Verwenden Sie für kleinere Quads UV. |
iResolution |
vec3 |
1.0 / SCREEN_PIXEL_SIZE |
Kann auch manuell übergeben werden. |
iTime |
float |
TIME |
Zeit seit dem Start des Shaders. |
iTimeDelta |
float |
Mit Uniform angeben |
Zeit um den vorherigen Frame zu rendern. |
iFrame |
float |
Mit Uniform angeben |
Framenummer. |
iChannelTime[4] |
float |
Mit Uniform angeben |
Zeit seit Start der gegebenen Textur. |
iMouse |
vec4 |
Mit Uniform angeben |
Mausposition in Pixelkoordinaten. |
iDate |
vec4 |
Mit Uniform angeben |
Aktuelles Datum in Sekunden. |
iChannelResolution[4] |
vec3 |
1.0 / TEXTURE_PIXEL_SIZE |
Auflösung der gegebenen Textur. |
iChanneli |
Sampler2D |
TEXTURE |
Godot bietet nur ein Built-in; Nutzer können mehr erzeugen. |
Koordinaten
fragCoord verhält sich genauso wie gl_FragCoord in GLSL und FRAGCOORD in Godot.
The Book of Shaders
Ähnlich wie bei Shadertoy bietet The Book of Shaders Zugriff auf einen Fragment-Shader im Webbrowser, mit dem der Benutzer interagieren kann. Der Benutzer kann nur Fragment-Shader-Code mit einer festgelegten Liste von übergebenen Uniforms schreiben und kann keine zusätzlichen Uniforms hinzufügen.
Für weitere Hilfe beim Portieren von Shadern auf verschiedene Frameworks im Allgemeinen bietet The Book of Shaders eine Seite zum Ausführen von Shadern in verschiedenen Frameworks.
Typen
The Book of Shaders verwendet die Webgl-Spezifikation, sodass eine etwas andere Version von GLSL ausgeführt wird. Es gibt jedoch weiterhin die regulären Typen, einschließlich Konstanten und Makros.
Main
Der Einstiegspunkt für einen Book of Shaders-Fragment-Shader ist main, genau wie in GLSL. Alles was in einer main -Funktion von Book of Shaders geschrieben ist, sollte in Godots fragment-Funktion kopiert werden.
Variablen
The Book of Shaders hält sich genauer an GLSL als Shadertoy. Es implementiert auch weniger Uniforms als Shadertoy.
Variable |
Typ |
Äquivalent |
Beschreibung |
|---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
Ausgabefarbe für jedes Pixel. |
gl_FragCoord |
vec4 |
FRAGCOORD |
Für Vollbild-Quads. Verwenden Sie für kleinere Quads UV. |
u_resolution |
vec2 |
1.0 / SCREEN_PIXEL_SIZE |
Kann auch manuell übergeben werden. |
u_time |
float |
TIME |
Zeit seit dem Start des Shaders. |
u_mouse |
vec2 |
Mit Uniform angeben |
Mausposition in Pixelkoordinaten. |
Koordinaten
The Book of Shaders verwendet dasselbe Koordinatensystem wie GLSL.