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.