Up to date

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

Spatial-Shader

Spatial-Shader werden zum Schattieren von 3D-Objekten verwendet, Sie sind die komplexesten, die Godot bietet. Spatial-Shader sind mit verschiedenen Rendermodi und verschiedenen Rendering-Optionen (z.B. Subsurface Scattering, Transmission, Ambient Occlusion, Randbeleuchtung usw.) hochgradig konfigurierbar. Benutzer können optional Vertex-, Fragment- und Lichtprozessorfunktionen schreiben, um zu beeinflussen, wie Objekte gezeichnet werden.

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.

depth_draw_opaque

Tiefe nur für undurchsichtige Geometrie (nicht transparent) zeichnen.

depth_draw_always

Tiefe immer zeichnen (undurchsichtig und transparent).

depth_draw_never

Tiefe niemals zeichnen.

depth_prepass_alpha

Für transparente Geometrie einen undurchsichtig-Tiefenvorlauf ausführen.

depth_test_disabled

Tiefenprüfung Deaktivieren.

sss_mode_skin

Subsurface Scattering-Modus für Haut.

cull_back

Backface-Culling durchführen (Default).

cull_front

Frontface-Culling durchführen.

cull_disabled

Culling deaktiviert (beidseitig).

unshaded

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

wireframe

Geometrie mit Linien zeichnen.

diffuse_burley

Burley (Disney PBS) für diffuses Licht (Default).

diffuse_lambert

Lambert-Schattierung für diffuses Licht.

diffuse_lambert_wrap

Lambert-Wrapping (rauheitsabhängig) für diffuses Licht.

diffuse_toon

Toon-Shading für diffuses Licht.

specular_schlick_ggx

Schlick-GGX für Specular (Standard).

specular_toon

Toon für Specular.

specular_disabled

Specular deaktiviert.

skip_vertex_transform

VERTEX/NORMAL/etc. müssen manuell in Vertexfunktion transformiert werden.

world_vertex_coords

VERTEX/NORMAL/etc. werden in Weltkoordinaten statt in lokalen Koordinaten geändert.

ensure_correct_normals

Wird verwendet, wenn eine uneinheitliche Skalierung auf das Mesh angewendet wird.

shadows_disabled

Schattenberechnung im Shader ausschalten.

ambient_light_disabled

Deaktivieren des Beitrags von Umgebungslicht und der Radiance Map.

shadow_to_opacity

Durch die Beleuchtung wird das Alpha so geändert, dass schattierte Bereiche undurchsichtig und nicht schattierte Bereiche transparent sind. Nützlich zum Überlagern von Schatten auf einen Kamera-Feed in AR.

vertex_lighting

Verwenden einer vertex-basierten Beleuchtung.

particle_trails

Aktiviert die Trails, wenn sie auf Partikelgeometrien verwendet werden.

alpha_to_coverage

Alpha-Antialiasing-Modus, siehe hier für mehr.

alpha_to_coverage_and_one

Alpha-Antialiasing-Modus, siehe hier für mehr.

fog_disabled

Deaktivieren des Empfangs von tiefenbasierten oder volumetrischen Nebeln. Nützlich für blend_add-Materialien wie Partikel.

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 in Sekunden.

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

Vertexdaten (VERTEX, NORMAL, TANGENT, BITANGENT) werden im lokalen Model-Space dargestellt. Wenn sie nicht beschrieben werden, werden diese Werte nicht verändert und werden so weitergegeben, wie sie gekommen sind.

Sie können optional im World-Space im Render-Modus world_vertex_coords dargestellt werden.

Benutzer können die Built-in-Modellansichtstransformation deaktivieren (die Projektion wird später immer noch durchgeführt) und sie mit dem folgenden Code manuell durchführen:

shader_type spatial;
render_mode skip_vertex_transform;

void vertex() {
    VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
    NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
    // same as above for binormal and tangent, if normal mapping is used
}

Andere Built-Ins, wie UV, UV2 und COLOR, werden ebenfalls an die Fragment-Funktion weitergegeben, wenn sie nicht geändert werden.

Benutzer können die Modellansicht und die Projektionstransformationen mit Hilfe der eingebauten POSITION überschreiben. Wenn POSITION verwendet wird, wird der Wert von VERTEX ignoriert und die Projektion findet nicht statt. Der Wert, der an den Fragment-Shader übergeben wird, stammt jedoch immer noch von VERTEX.

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.

Dies ermöglicht es Ihnen, den Shader einfach an ein Partikelsystem anzupassen, das Default-Partikelmaterial verwendet. Wenn Sie einen benutzerdefinierten Partikel-Shader schreiben, können Sie diesen Wert nach Belieben verwenden.

Built-in

Beschreibung

in vec2 VIEWPORT_SIZE

Größe des Viewports (in Pixeln).

in mat4 VIEW_MATRIX

Transformation von World-Space nach View-Space.

in mat4 INV_VIEW_MATRIX

Transformation von View-Space nach World-Space.

in mat4 INV_PROJECTION_MATRIX

Transformation von Clip-Space nach View-Space.

in vec3 NODE_POSITION_WORLD

World-Space-Position des Nodes.

in vec3 NODE_POSITION_VIEW

View-Space-Position des Nodes.

in vec3 CAMERA_POSITION_WORLD

World-Space-Position der Kamera.

in vec3 CAMERA_DIRECTION_WORLD

World-Space-Richtung der Kamera.

in bool OUTPUT_IS_SRGB

true, wenn die Ausgabe im sRGB-Farbraum erfolgt (dies ist true im Kompatibilität-Renderer, false in Forward+ und Forward Mobile).

in int INSTANCE_ID

Instanz-ID zum Instanziieren.

in vec4 INSTANCE_CUSTOM

Benutzerdefinierte Instanzdaten (meistens für Partikel).

in int VIEW_INDEX

Die Ansicht, die gerendert wird. VIEW_MONO_LEFT (0) für Mono (nicht Multiview) oder linkes Auge, VIEW_RIGHT (1) für rechtes Auge.

in int VIEW_MONO_LEFT

Konstante für Mono oder linkes Auge, immer 0.

in int VIEW_RIGHT

Konstante für das rechte Auge, immer 1.

in vec3 EYE_OFFSET

Positions-Offset für das gerenderte Auge. Gilt nur für Multiview-Rendering.

inout vec3 VERTEX

Vertex in lokalen Koordinaten.

in int VERTEX_ID

Der Index des aktuellen Vertex im Vertex-Puffer.

inout vec3 NORMAL

Normale in lokalen Koordinaten.

inout vec3 TANGENT

Tangente in lokalen Koordinaten.

inout vec3 BINORMAL

Binormale in lokalen Koordinaten.

out vec4 POSITION

Wenn dieser Wert beschrieben wird, überschreibt er die endgültige Vertex-Position.

inout vec2 UV

UV Hauptkanal.

inout vec2 UV2

UV Sekundärkanal.

inout vec4 COLOR

Farbe der Vertices.

out float ROUGHNESS

Rauheit für Vertex-Beleuchtung.

inout float POINT_SIZE

Punktgröße für Punkt-Rendering.

inout mat4 MODELVIEW_MATRIX

Transformation von Model-Space nach View-Space (verwenden, wenn möglich).

inout mat3 MODELVIEW_NORMAL_MATRIX

inout mat4 MODEL_MATRIX

Transformation von Model-Space nach World-Space.

inout mat3 MODEL_NORMAL_MATRIX

inout mat4 PROJECTION_MATRIX

Transformation von View-Space nach Clip-Space.

inout uvec4 BONE_INDICES

inout vec4 BONE_WEIGHTS

in vec4 CUSTOM0

in vec4 CUSTOM1

in vec4 CUSTOM2

in vec4 CUSTOM3

Bemerkung

MODELVIEW_MATRIX kombiniert sowohl MODEL_MATRIX als auch VIEW_MATRIX und ist besser geeignet, wenn Float-Probleme auftreten können. Wenn zum Beispiel das Objekt sehr weit vom Weltursprung entfernt ist, kann es bei der Verwendung des getrennten MODEL_MATRIX und VIEW_MATRIX zu Float-Problemen kommen.

Fragment-Built-ins

Die Standardverwendung einer Godot-Fragmentprozessorfunktion besteht darin, die Materialeigenschaften Ihres Objekts einzurichten und den Built-in-Renderer die endgültige Schattierung vornehmen zu lassen. Sie müssen jedoch nicht alle diese Propertys verwenden, und wenn Sie sie nicht befüllen, wird Godot die entsprechenden Funktionalitäten wegoptimieren.

Built-in

Beschreibung

in vec2 VIEWPORT_SIZE

Größe des Viewports (in Pixeln).

in vec4 FRAGCOORD

Koordinate der Pixelmitte im Bildschirmraum. xy spezifiziert die Position im Fenster, z spezifiziert die Fragmenttiefe, wenn DEPTH nicht benutzt wird. Der Ursprung ist unten links.

in bool FRONT_FACING

true, wenn die aktuelle Fläche die vordere Fläche ist.

in vec3 VIEW

Normalized vector from fragment position to camera (in view space). This is the same for both perspective and orthogonal cameras.

in vec2 UV

UV, das von einer Vertex-Funktion stammt.

in vec2 UV2

UV2, das von einer Vertex-Funktion stammt.

in vec4 COLOR

COLOR, die von einer Vertex-Funktion stammt.

in vec2 POINT_COORD

Punktkoordinate zum Zeichnen von Punkten mit POINT_SIZE.

in bool OUTPUT_IS_SRGB

true, wenn die Ausgabe im sRGB-Farbraum erfolgt (dies ist true im Kompatibilität-Renderer, false in Forward+ und Forward Mobile).

in mat4 MODEL_MATRIX

Transformation von Model-Space nach World-Space.

in mat3 MODEL_NORMAL_MATRIX

in mat4 VIEW_MATRIX

Transformation von World-Space nach View-Space.

in mat4 INV_VIEW_MATRIX

Transformation von View-Space nach World-Space.

in mat4 PROJECTION_MATRIX

Transformation von View-Space nach Clip-Space.

in mat4 INV_PROJECTION_MATRIX

Transformation von Clip-Space nach View-Space.

in vec3 NODE_POSITION_WORLD

Node-Position im World-Space.

in vec3 NODE_POSITION_VIEW

Node-Position im View-Space.

in vec3 CAMERA_POSITION_WORLD

Kamera-Position im World-Space.

in vec3 CAMERA_DIRECTION_WORLD

Kamera-Richtung im World-Space.

in vec3 VERTEX

Vertex, der von einer Vertexfunktion stammt (Default im View-Space).

in int VIEW_INDEX

Die Ansicht, die gerendert wird. VIEW_MONO_LEFT (0) für Mono (nicht Multiview) oder linkes Auge, VIEW_RIGHT (1) für rechtes Auge.

in int VIEW_MONO_LEFT

Konstante für Mono oder linkes Auge, immer 0.

in int VIEW_RIGHT

Konstante für das rechte Auge, immer 1.

in vec3 EYE_OFFSET

Positions-Offset für das gerenderte Auge. Gilt nur für Multiview-Rendering.

sampler2D SCREEN_TEXTURE

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

in vec2 SCREEN_UV

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

sampler2D DEPTH_TEXTURE

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

out float DEPTH

Benutzerdefinierter Tiefenwert (0..1). Wenn DEPTH in einem beliebigen Shaderzweig geschrieben wird, dann sind Sie dafür verantwortlich, DEPTH für alle anderen Zweige zu setzen. Andernfalls wird die Grafik-API sie uninitialisiert lassen.

inout vec3 NORMAL

Normale, die von einer Vertexfunktion stammt (Default, im View-Space).

inout vec3 TANGENT

Tangente, die von einer Vertex-Funktion kommt.

inout vec3 BINORMAL

Binormale, die von einer Vertex-Funktion stammt.

out vec3 NORMAL_MAP

Stellen Sie hier die Normale ein, wenn die Normale von einer Textur normal statt von NORMAL gelesen wird.

out float NORMAL_MAP_DEPTH

Tiefe von der Variablen oben. Default-Wert 1.0.

out vec3 ALBEDO

Albedo (Default Weiß).

out float ALPHA

Alpha (0,1); falls genutzt, wird das Material in die transparente Pipeline geleitet.

out float ALPHA_SCISSOR_THRESHOLD

Beim Befüllen werden Werte unter einem bestimmten Alpha-Wert verworfen.

out float ALPHA_HASH_SCALE

out float ALPHA_ANTIALIASING_EDGE

out vec2 ALPHA_TEXTURE_COORDINATE

out float METALLIC

Metallisch (0..1).

out float SPECULAR

Specular. Der Default ist 0,5. Am besten nicht ändern, es sei denn, Sie möchten IOR ändern.

out float ROUGHNESS

Rauheit (0..1).

out float RIM

Rim (0..1). Falls verwendet, berechnet Godot die Randbeleuchtung.

out float RIM_TINT

Rim Tint, geht von 0 (weiß) bis 1 (Albedo). Falls verwendet, berechnet Godot die Randbeleuchtung.

out float CLEARCOAT

Kleiner hinzugefügter spiegelnder Klecks. Falls verwendet, berechnet Godot den Klarlack.

out float CLEARCOAT_GLOSS

Glanz von Klarlack. Bei Verwendung berechnet Godot den Glanz vom Klarlack.

out float ANISOTROPY

Zum Verzerren des Spiegelkleckses entsprechend des Tangentenraums.

out vec2 ANISOTROPY_FLOW

Verzerrungsrichtung, mit Flowmaps verwenden.

out float SSS_STRENGTH

Stärke des Subsurface Scattering. Bei Verwendung wird Subsurface Scattering auf das Objekt angewendet.

out vec4 SSS_TRANSMITTANCE_COLOR

out float SSS_TRANSMITTANCE_DEPTH

out float SSS_TRANSMITTANCE_BOOST

inout vec3 BACKLIGHT

out float AO

Stärke der Ambient Occlusion. Zur Verwendung mit vorgebackener AO.

out float AO_LIGHT_AFFECT

Wie stark AO die Beleuchtung beeinflusst (0..1; Default 0).

out vec3 EMISSION

Emissionsfarbe (kann für HDR über 1,1,1 gehen).

out vec4 FOG

Wenn dieser Wert befüllt wird, wird die endgültige Pixelfarbe mit FOG.rgb basierend auf FOG.a gemischt.

out vec4 RADIANCE

Wenn dieser wert befüllt wird, wird die Radiance der Environment Map mit RADIANCE.rgb auf der Grundlage von RADIANCE.a gemischt.

out vec4 IRRADIANCE

Wenn es geschrieben wird, wird die IRRADIANCE der Environment Map mit IRRADIANCE.rgb auf der Grundlage von IRRADIANCE.a gemischt.

Bemerkung

Shader, welche die transparente Pipeline durchlaufen, wenn in ALPHA geschrieben wird, können Probleme mit der Transparenzsortierung aufweisen. Lesen Sie den Abschnitt Transparenzsortierung in der "3D-Rendering-Beschränkungen"-Seite für weitere Informationen und Möglichkeiten zur Vermeidung von Problemen.

Licht-Built-ins

Das Schreiben von Lichtprozessorfunktionen ist völlig optional. Sie können die Lichtfunktion überspringen, indem Sie render_mode auf unshaded setzen. Wenn keine Lichtfunktion geschrieben wird, verwendet Godot die in der Fragmentfunktion geschriebenen Materialeigenschaften, um die Beleuchtung für Sie zu berechnen (abhängig vom render_mode).

Die Lichtfunktion wird für jedes Licht in jedem Pixel aufgerufen. Sie wird innerhalb einer Schleife für jeden Lichttyp aufgerufen.

Unten finden Sie ein Beispiel für eine benutzerdefinierte Lichtfunktion unter Verwendung eines Lambertschen Beleuchtungsmodells:

void light() {
    DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR;
}

Wenn mehrere Lichter addiert werden sollen, fügen Sie den Lichtanteil zu DIFFUSE_LIGHT mittels += hinzu, anstatt ihn zu überschreiben.

Warnung

Die Funktion light() wird nicht ausgeführt, wenn der Rendermodus vertex_lighting aktiviert ist, oder wenn Rendering > Qualität > Schattierung > Vertex-Schattierung erzwingen in den Projekteinstellungen aktiviert ist. (Auf mobilen Plattformen ist es standardmäßig aktiviert).

Built-in

Beschreibung

in vec2 VIEWPORT_SIZE

Größe des Viewports (in Pixeln).

in vec4 FRAGCOORD

Koordinate der Pixelmitte im Bildschirmraum. xy spezifiziert die Position im Fenster, z spezifiziert die Fragmenttiefe, wenn DEPTH nicht benutzt wird. Der Ursprung ist unten links.

in mat4 MODEL_MATRIX

Transformation von Model-Space nach World-Space.

in mat4 INV_VIEW_MATRIX

Transformation von View-Space nach World-Space.

in mat4 VIEW_MATRIX

Transformation von World-Space nach View-Space.

in mat4 PROJECTION_MATRIX

Transformation von View-Space nach Clip-Space.

in mat4 INV_PROJECTION_MATRIX

Transformation von Clip-Space nach View-Space.

in vec3 NORMAL

Normalvektor im View-Space.

in vec2 UV

UV, das von einer Vertex-Funktion stammt.

in vec2 UV2

UV2, das von einer Vertex-Funktion stammt.

in vec3 VIEW

View-Vektor im View-Space.

in vec3 LIGHT

Lichtvektor im View-Space.

in vec3 LIGHT_COLOR

Farbe des Lichts multipliziert mit Energie * PI. Die Multiplikation mit PI ist vorhanden, weil Physikbasierte Beleuchtungsmodelle eine Division durch PI vorsehen.

in float SPECULAR_AMOUNT

2.0 * light_specular-Property für OmniLight3D und SpotLight3D. 1.0 für DirectionalLight3D.

in bool LIGHT_IS_DIRECTIONAL

true, wenn dieser Durchlauf ein DirectionalLight3D ist.

in float ATTENUATION

Dämpfung basierend auf Entfernung oder Schatten.

in vec3 ALBEDO

Basis-Albedo.

in vec3 BACKLIGHT

in float METALLIC

Metallisch.

in float ROUGHNESS

Rauheit.

in bool OUTPUT_IS_SRGB

true, wenn die Ausgabe im sRGB-Farbraum erfolgt (dies ist true im Kompatibilität-Renderer, false in Forward+ und Forward Mobile).

out vec3 DIFFUSE_LIGHT

Diffuses Licht-Ergebnis.

out vec3 SPECULAR_LIGHT

Specular Licht-Ergebnis.

out float ALPHA

Alpha (0,1); falls genutzt, wird das Material in die transparente Pipeline geleitet.

Bemerkung

Shader, welche die transparente Pipeline durchlaufen, wenn in ALPHA geschrieben wird, können Probleme mit der Transparenzsortierung aufweisen. Lesen Sie den Abschnitt Transparenzsortierung in der "3D-Rendering-Beschränkungen"-Seite für weitere Informationen und Möglichkeiten zur Vermeidung von Problemen.

Transparente Materialien können auch keine Schatten werfen oder in hint_screen_texture und hint_depth_texture Uniforms erscheinen. Dies wiederum verhindert, dass diese Materialien in Screen-Space-Reflexionen oder Brechung erscheinen. SDFGI scharfe Reflexionen sind auf transparenten Materialien nicht sichtbar (nur grobe Reflexionen sind auf transparenten Materialien sichtbar).