Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

2D CanvasItem-Shader

CanvasItem-Shader werden verwendet, um alle 2D-Elemente in Godot zu zeichnen. Dazu gehören alle Nodes, die von CanvasItems erben, sowie alle GUI-Elemente.

CanvasItem-Shader enthalten weniger Built-in-Variablen und Funktionen als Spatial-Shader, behalten jedoch dieselbe Grundstruktur mit Vertex-, Fragment- und Lichtprozessorfunktionen bei.

Render-Modi

Rendermodus

Beschreibung

blend_mix

Mix-Blending-Modus (Alpha ist Transparenz), Default.

blend_add

Additiver Blending-Modus.

blend_sub

Subtraktiver Blending-Modus.

blend_mul

Multiplikativer Blending-Modus.

blend_premul_alpha

Vormultiplizierter Alpha-Blending-Modus.

blend_disabled

Blending deaktivieren. Werte (einschließlich Alpha) werden unverändert geschrieben.

unshaded

Das Ergebnis ist einfaches Albedo. Kein Licht/Schatten auf diesem Material.

light_only

Nur bei Lichtdurchlauf zeichnen.

skip_vertex_transform

VERTEX muss manuell in die Vertex-Funktion transformiert werden.

world_vertex_coords

VERTEX wird in Weltkoordinaten statt in lokalen Koordinaten geändert.

Built-ins

Mit "in" gekennzeichnete Werte sind schreibgeschützt. Mit "out" gekennzeichnete Werte dienen zum optionalen Schreiben und enthalten nicht unbedingt sinnvolle Werte. Als "inout" gekennzeichnete Werte stellen einen sinnvollen Default-Wert dar und können optional beschrieben werden. Sampler sind nicht Gegenstand des Schreibens und werden nicht markiert.

Globale Built-ins

Globale Built-ins sind überall verfügbar, einschließlich benutzerdefinierter Funktionen.

Built-in

Beschreibung

in float TIME

Globale Zeit seit dem Start der Engine, in Sekunden (immer positiv). Sie unterliegt der Rollover-Einstellung (die standardmäßig 3.600 Sekunden beträgt). Sie wird nicht von time_scale oder dem Pausieren beeinflusst, aber Sie können ein globales Shader-Uniform definieren, um eine "skalierte" TIME-Variable hinzuzufügen, falls gewünscht.

in float PI

Eine PI-Konstante (3,141592). Das Verhältnis des Kreisumfangs zu seinem Durchmesser und die Anzahl der Bogenmaßeinheiten in einer halben Umdrehung.

in float TAU

Eine TAU-Konstante (6.283185). Ein Äquivalent von PI * 2 und die Anzahl der Bogenmaßeinheiten in einer vollen Umdrehung.

in float E

Eine E-Konstante (2,718281). Eulersche Zahl und eine Basis des natürlichen Logarithmus.

Vertex-Built-ins

Vertex-Daten (VERTEX) werden im Local-Space dargestellt (Pixelkoordinaten, relativ zum Ursprung des Node2D). Wenn sie nicht beschrieben werden, werden diese Werte nicht verändert und werden so weitergegeben, wie sie eingegangen sind.

Der Benutzer kann die eingebaute Model-to-World-Transformation deaktivieren (die World-to-Screen-Transformation und die Projektion werden später immer noch durchgeführt) und sie manuell mit dem folgenden Code durchführen:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

    VERTEX = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy;
}

Andere Built-ins wie UV und COLOR werden ebenfalls an die Fragmentfunktion übergeben, wenn sie nicht verändert wurden.

Beim Instanziieren enthält die Variable INSTANCE_CUSTOM die benutzerdefinierten Daten der Instanz. Bei der Verwendung von Partikeln ist diese Information normalerweise:

  • x: Rotationswinkel in Bogenmaß.

  • y: Phase während der Lebensdauer (0 bis 1).

  • z: Animations-Frame.

Built-in

Beschreibung

in mat4 MODEL_MATRIX

Transformation vom Local Space in den World Space. World Space sind die Koordinaten, die Sie normalerweise im Editor verwenden.

in mat4 CANVAS_MATRIX

Transformation vom World Space in den Canvas-Space. Im Canvas-Space ist der Ursprung die obere linke Ecke des Bildschirms und die Koordinaten reichen von (0, 0) bis zur Viewport-Größe.

in mat4 SCREEN_MATRIX

Canvas Space nach Clip Space. Die Koordinaten des Clip Space reichen von (-1, -1) bis (1, 1).

in int INSTANCE_ID

Instanz-ID zum Instanziieren.

in vec4 INSTANCE_CUSTOM

Benutzerdefinierte Daten instanzieren.

in bool AT_LIGHT_PASS

Immer false.

in vec2 TEXTURE_PIXEL_SIZE

Normalisierte Pixelgröße der Default-2D-Textur. Für ein Sprite2D mit einer Textur der Größe 64x32px ist TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 VERTEX

Vertex, im Local Space.

in int VERTEX_ID

Der Index des aktuellen Vertex im Vertex-Puffer.

inout vec2 UV

Normalisierte Texturkoordinaten. Werte zwischen 0 und 1.

inout vec4 COLOR

Farbe vom Vertex-Primitiv.

inout float POINT_SIZE

Punktgröße für Punktzeichnen.

Fragment-Built-ins

Bestimmte Nodes (zum Beispiel Sprite2Ds) zeigen standardmäßig eine Textur an. Wenn jedoch eine benutzerdefinierte Fragmentfunktion an diese Nodes angehängt wird, muss die Textur manuell gesucht werden. Godot liefert die Texturfarbe in der Built-in-Variable COLOR multipliziert mit der Farbe des Nodes. Um die Texturfarbe selbst zu lesen, können Sie folgendes verwenden:

COLOR = texture(TEXTURE, UV);

Ähnlich verhält es sich, wenn eine Normal Map in der CanvasTexture verwendet wird: Godot verwendet sie standardmäßig und weist ihren Wert der Built-in-Variablen NORMAL zu. Wenn Sie eine Normal Map verwenden, die für die Verwendung in 3D gedacht ist, wird sie invertiert erscheinen. Um sie in Ihrem Shader zu verwenden, müssen Sie sie dem Property NORMALMAP zuweisen. Godot kümmert sich darum, sie für die Verwendung in 2D zu konvertieren und NORMAL zu überschreiben.

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

Built-in

Beschreibung

in vec4 FRAGCOORD

Coordinate of pixel center. In screen space. xy specifies position in window. Origin is lower-left.

in vec2 SCREEN_PIXEL_SIZE

Größe der einzelnen Pixel. Entspricht dem Inversen der Auflösung.

in vec2 POINT_COORD

Koordinaten für Zeichnungspunkte.

sampler2D TEXTURE

Default-2D-Textur.

in vec2 TEXTURE_PIXEL_SIZE

Normalisierte Pixelgröße der Default-2D-Textur. Für ein Sprite2D mit einer Textur der Größe 64x32px ist TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in bool AT_LIGHT_PASS

Immer false.

sampler2D SPECULAR_SHININESS_TEXTURE

Spiegelglanztextur dieses Objekts.

in vec4 SPECULAR_SHININESS

Farbe des spiegelnden Glanzes, wie sie aus der Textur abgetastet wurde.

in vec2 UV

UV aus Vertex-Funktion.

in vec2 SCREEN_UV

Screen-UV-Koordinate für das aktuelle Pixel.

sampler2D SCREEN_TEXTURE

Entfernt in Godot 4. Verwenden Sie stattdessen ein sampler2D mit hint_screen_texture.

inout vec3 NORMAL

Normale, die aus NORMAL_TEXTURE gelesen wird. Beschreibbar.

sampler2D NORMAL_TEXTURE

Default-2D-Normalentextur.

out vec3 NORMAL_MAP

Konfiguriert Normal Maps, die für 3D gedacht sind, für die Verwendung in 2D. Falls verwendet, wird NORMAL überschrieben.

out float NORMAL_MAP_DEPTH

Normal Map-Tiefe für die Skalierung.

inout vec2 VERTEX

Pixelposition im Screen Space.

inout vec2 SHADOW_VERTEX

Dasselbe wie VERTEX, aber es kann geschrieben werden, um Schatten zu verändern.

inout vec3 LIGHT_VERTEX

Dasselbe wie VERTEX, kann aber geschrieben werden, um die Beleuchtung zu verändern. Die Z-Komponente stellt die Höhe dar.

inout vec4 COLOR

Farbe aus der Vertex-Funktion multipliziert mit der TEXTURE-Farbe. Gibt auch den Farbwert aus.

Licht-Built-ins

Die Lichtprozessorfunktionen arbeiten in Godot 4.x anders als in Godot 3.x. In Godot 4.x wird die gesamte Beleuchtung während des regulären Zeichenvorgangs ausgeführt. Mit anderen Worten: Godot zeichnet das Objekt nicht mehr für jedes Licht neu.

Verwenden Sie render_mode unshaded, wenn Sie nicht wollen, dass die Lichtprozessorfunktion läuft.Verwenden Sie render_mode light_only, wenn Sie nur die Auswirkungen der Beleuchtung auf ein Objekt sehen wollen; dies kann nützlich sein, wenn Sie das Objekt nur dort sehen wollen, wo es von Licht bedeckt ist.

Wenn Sie eine Lichtfunktion definieren, wird diese die Built-in-Lichtfunktion ersetzen, auch wenn Ihre Lichtfunktion leer ist.

Unten sehen Sie ein Beispiel für einen Licht-Shader, der die Normal Map eines CanvasItems berücksichtigt:

void light() {
  float cNdotL = max(0.0, dot(NORMAL, LIGHT_DIRECTION));
  LIGHT = vec4(LIGHT_COLOR.rgb * COLOR.rgb * LIGHT_ENERGY * cNdotL, LIGHT_COLOR.a);
}

Built-in

Beschreibung

in vec4 FRAGCOORD

Coordinate of pixel center. In screen space. xy specifies position in window. Origin is lower-left.

in vec3 NORMAL

Eingabe-Normale.

in vec4 COLOR

Eingabe-Farbe. Dies ist die Ausgabe der Fragmentfunktion.

in vec2 UV

UV aus der Vertex-Funktion, äquivalent zum UV in der Fragment-Funktion.

sampler2D TEXTURE

Aktuell verwendete Textur für CanvasItem.

in vec2 TEXTURE_PIXEL_SIZE

Normalisierte Pixelgröße der TEXTURE. Für ein Sprite2D mit einer TEXTURE der Größe 64x32px ist TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

Screen-UV-Koordinate für das aktuelle Pixel.

in vec2 POINT_COORD

UV für Punkt-Sprite.

in vec4 LIGHT_COLOR

Farbe des Lichts multipliziert mit der Textur des Lichts.

in float LIGHT_ENERGY

Energiemultiplikator des Lichts.

in vec3 LIGHT_POSITION

Position des Lichts im Screen Space. Bei Verwendung eines DirectionalLight2D ist dies immer vec3(0,0,0).

in vec3 LIGHT_DIRECTION

Richtung des Lichts im Screen Space.

in bool LIGHT_IS_DIRECTIONAL

true, wenn dieser Durchlauf ein DirectionalLight2D ist.

in vec3 LIGHT_VERTEX

Pixelposition, im Screen Space, wie in der Fragmentfunktion geändert wurde.

inout vec4 LIGHT

Ausgangsfarbe für dieses Licht.

in vec4 SPECULAR_SHININESS

Spiegelnder Glanz, wie in der Textur des Objekts festgelegt.

out vec4 SHADOW_MODULATE

Multipliziert den Schattenwurf an diesem Punkt mit dieser Farbe.

SDF-Funktionen

Es sind einige zusätzliche Funktionen implementiert, um eine automatisch generierte Signed Distance Field-Textur abzutasten. Diese Funktionen sind für Fragment- und Lichtfunktionen von CanvasItem-Shadern verfügbar.

Das Signed Distance Field wird von LightOccluder2D Nodes generiert, die in der Szene vorhanden sind und bei denen die SDF Collision-Property aktiviert ist (was der Default ist). Siehe die 2D Lichter und Schatten-Dokumentation für weitere Informationen.

Funktion

Beschreibung

float texture_sdf (vec2 sdf_pos)

Führt eine SDF-Textursuche durch.

vec2 texture_sdf_normal (vec2 sdf_pos)

Berechnet eine Normale aus der SDF-Textur.

vec2 sdf_to_screen_uv (vec2 sdf_pos)

Konvertiert ein SDF in eine Bildschirm-UV.

vec2 screen_uv_to_sdf (vec2 uv)

Konvertiert Bildschirm-UV in ein SDF.