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" |
in float PI |
Eine |
in float TAU |
Eine |
in float E |
Eine |
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 |
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 = |
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. |
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 = |
in bool AT_LIGHT_PASS |
Immer |
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 |
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 |
inout vec3 LIGHT_VERTEX |
Dasselbe wie |
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. |
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 = |
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 |
in vec3 LIGHT_DIRECTION |
Richtung des Lichts im Screen Space. |
in bool LIGHT_IS_DIRECTIONAL |
|
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. |