Up to date

This page is up to date for Godot 4.3. 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

Global time since the engine has started, in seconds. It repeats after every 3,600 seconds (which can be changed with the rollover setting). It's not affected by time_scale or pausing. If you need a TIME variable that can be scaled or paused, add your own global shader uniform and update it each frame.

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);
    BINORMAL = normalize((MODELVIEW_MATRIX * vec4(BINORMAL, 0.0)).xyz);
    TANGENT = normalize((MODELVIEW_MATRIX * vec4(TANGENT, 0.0)).xyz);
}

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

Der Benutzer kann die Modellansicht und die Projektionstransformationen mit Hilfe der eingebauten POSITION überschreiben. Wenn POSITION irgendwo in den Shader geschrieben wird, wird es immer benutzt, so dass der Benutzer dafür verantwortlich ist, dass es immer einen akzeptablen Wert hat. Wenn POSITION verwendet wird, wird der Wert von VERTEX ignoriert und es findet keine Projektion 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 MAIN_CAM_INV_VIEW_MATRIX

Transformation der Kamera, die zum Zeichnen des aktuellen Viewports verwendet wird, vom View Space in den 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 uint CAMERA_VISIBLE_LAYERS

Ebenen der Kamera beim Rendern des aktuellen Durchlaufs cullen.

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

in mat4 MODEL_MATRIX

Transformation von Model-Space nach World-Space.

in mat3 MODEL_NORMAL_MATRIX

inout mat4 PROJECTION_MATRIX

Transformation von View-Space nach Clip-Space.

in uvec4 BONE_INDICES

in vec4 BONE_WEIGHTS

in vec4 CUSTOM0

Custom value from vertex primitive. When using extra UVs, xy is UV3 and zw is UV4.

in vec4 CUSTOM1

Custom value from vertex primitive. When using extra UVs, xy is UV5 and zw is UV6.

in vec4 CUSTOM2

Custom value from vertex primitive. When using extra UVs, xy is UV7 and zw is UV8.

in vec4 CUSTOM3

Benutzerdefinierter Wert vom Scheitelpunktprimitiv.

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.

Bemerkung

INV_VIEW_MATRIX ist die Matrix, die zum Rendern des Objekts in diesem Durchgang verwendet wird, nicht wie MAIN_CAM_INV_VIEW_MATRIX, die die Matrix der Kamera in der Szene ist. Im Schattendurchgang basiert die Ansicht von INV_VIEW_MATRIX auf der Kamera, die sich an der Position des Lichts befindet.

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

Coordinate of pixel center in screen space. xy specifies position in window. Origin is lower left. z specifies fragment depth. It is also used as the output value for the fragment depth unless DEPTH is written to.

in bool FRONT_FACING

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

in vec3 VIEW

Normalisierter Vektor von der Fragmentposition zur Kamera (im View-Space). Dies gilt sowohl für perspektivische als auch für orthogonale Kameras.

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 uint CAMERA_VISIBLE_LAYERS

Ebenen der Kamera beim Rendern des aktuellen Durchlaufs cullen.

in vec3 VERTEX

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

inout vec3 LIGHT_VERTEX

Eine beschreibbare Version von VERTEX, die zur Veränderung von Licht und Schatten verwendet werden kann. Durch das Schreiben wird die Position des Fragments nicht verändert.

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 ausgelesen oder beschrieben, 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).