Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
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¶
The Godot shader preprocessor supports the following macros:
#define
/#undef
#if
,#elif
,#else
,#endif
,defined()
,#ifdef
,#ifndef
#include
(only.gdshaderinc
files and with a maximum depth of 25)#pragma disable_preprocessor
, which disables preprocessing for the rest of the file
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.