3D Spatial-Shader

Spatial-Shader (Spatial=Raum, räumlich) 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. Streuung unter der Oberfläche, Übertragung, Umgebungsverdeckung, Randbeleuchtung usw.) hochgradig konfigurierbar. Benutzer können optional Scheitelpunkt-, Fragment- und Lichtprozessorfunktionen schreiben, um zu beeinflussen, wie Objekte gezeichnet werden.

Render-Modi

Render Modus

Beschreibung

blend_mix

Mischmodus (Alpha ist Transparenz), Standard.

blend_add

Additiver Mischungsmodus.

blend_sub

Subtraktiver Mischungsmodus.

blend_mul

Multiplikativer Mischungsmodus.

depth_draw_opaque

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

depth_draw_always

Tiefe immer zeichnen (blickdicht und transparent).

depth_draw_never

Tiefe niemals zeichnen.

depth_draw_alpha_prepass

Für transparente Geometrie einen blickdicht Tiefenvorlauf ausführen.

depth_test_disable

Tiefenprüfung Deaktivieren.

cull_front

Frontseiten ausblenden.

cull_back

Rückseiten ausblenden (Standard).

cull_disabled

Ausblenden deaktiviert (beidseitig).

unshaded

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

diffuse_lambert

Lambert-Schattierung für diffuses Licht (Standard).

diffuse_lambert_wrap

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

diffuse_oren_nayar

Oren Nayar für diffuses Licht.

diffuse_burley

Burley (Disney PBS) für diffuses Licht.

diffuse_toon

Toon-Schattierung für diffuses Licht.

specular_schlick_ggx

Schlick-GGX für spiegelnd (Standard).

specular_blinn

Blinn für spiegelnd (Kompatibilität).

specular_phong

Phong für spiegelnd (Kompatibilität).

specular_toon

Toon für diffuses Licht.

specular_disabled

Spiegelung ausschalten.

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.

vertex_lighting

Verwenden einer vertex-basierten Beleuchtung.

shadows_disabled

Schattenberechnung im Shader ausschalten.

ambient_light_disabled

Disable contribution from ambient light and 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.

integrierte Elemente

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 Standardwert dar und können optional beschrieben werden. Sampler können nicht geschrieben werden und sind nicht markiert.

Global integrierte Elemente

Globale integrierte Elemente sind überall verfügbar, einschließlich benutzerdefinierter Funktionen.

integriert

Beschreibung

in float TIME

Globale Zeit in Sekunden.

integrierte Vertex-Elemente

Vertex data (VERTEX, NORMAL, TANGENT, BITANGENT) are presented in local model space. If not written to, these values will not be modified and be passed through as they came.

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

Users can disable the built-in modelview transform (projection will still happen later) and do it manually with the following code:

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
}

Other built-ins, such as UV, UV2 and COLOR, are also passed through to the fragment function if not modified.

Users can override the modelview and projection transforms using the POSITION built-in. When POSITION is used, the value from VERTEX is ignored and projection does not happen. However, the value passed to the fragment shader still comes from VERTEX.

For instancing, the INSTANCE_CUSTOM variable contains the instance custom data. When using particles, this information is usually:

  • x: Rotationswinkel in Radiant.

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

  • z: Animations-Frame.

This allows you to easily adjust the shader to a particle system using default particles material. When writing a custom particle shader, this value can be used as desired.

integriert

Beschreibung

in vec2 VIEWPORT_SIZE

Größe des Anzeigebereichs (in Pixeln).

inout mat4 WORLD_MATRIX

Modellraum in Weltenraum umwandeln.

in mat4 INV_CAMERA_MATRIX

Weltenraum in Modellraum umwandeln.

inout mat4 PROJECTION_MATRIX

Ansichtsbereich im Ausschnittsbereich umwandeln.

in mat4 CAMERA_MATRIX

Ansichtsbereich in Weltenraum umwandeln.

inout mat4 MODELVIEW_MATRIX

Modellraum zur Ansicht der Raumtransformation (wenn möglich verwenden).

inout mat4 INV_PROJECTION_MATRIX

Ausschnittsbereich in Ansichtsbereich umwandeln.

inout vec3 VERTEX

Vertex in lokalen Koordinaten.

out vec4 POSITION

If written to, overrides final vertex position.

inout vec3 NORMAL

Normal in lokalen Koordinaten.

inout vec3 TANGENT

Tangente in lokalen Koordinaten.

inout vec3 BINORMAL

Binormal in lokalen Koordinaten.

out float ROUGHNESS

Unebenheit für Vertex-Beleuchtung.

inout vec2 UV

UV Hauptkanal.

inout vec2 UV2

UV Zweitkanal.

in bool OUTPUT_IS_SRGB

wahr, wenn Berechnungen im sRGB-Farbraum erfolgen (wahr in GLES2, `falsch in GLES3).

inout vec4 COLOR

Farbe der Eckpunkte.

inout float POINT_SIZE

Punktgröße für Punkt-Renderer.

in int INSTANCE_ID

Instanz-ID zum Instanzieren.

in vec4 INSTANCE_CUSTOM

Benutzerdefinierte Instanzdaten (meistens für Partikel).

eingebaute Fragmente-Typen

The default use of a Godot fragment processor function is to set up the material properties of your object and to let the built-in renderer handle the final shading. However, you are not required to use all these properties, and if you don't write to them, Godot will optimize away the corresponding functionality.

integriert

Beschreibung

in vec2 VIEWPORT_SIZE

Größe des Anzeigebereichs (in Pixeln).

in vec4 FRAGCOORD

Coordinate of pixel center in screen space. xy specifies position in window, z specifies fragment depth if DEPTH is not used. Origin is lower-left.

in mat4 WORLD_MATRIX

Modellraum in Weltenraum umwandeln.

in mat4 INV_CAMERA_MATRIX

Weltenraum in Modellraum umwandeln.

in mat4 CAMERA_MATRIX

Ansichtsbereich in Weltenraum umwandeln.

in mat4 PROJECTION_MATRIX

Ansichtsbereich im Ausschnittsbereich umwandeln.

in mat4 INV_PROJECTION_MATRIX

Ausschnittsbereich in Ansichtsbereich umwandeln.

in vec3 VERTEX

Vertex, der von einer Vertexfunktion stammt (Standard, im Ansichtsraum).

in vec3 VIEW

Vektor von der Kamera zur Position des Fragments (im Ansichtsraum).

in bool FRONT_FACING

true wenn das aktuelle Gesicht das vordere Gesicht ist.

inout vec3 NORMAL

Normal, das von einer Vertexfunktion stammt (Standard, im Ansichtsraum).

inout vec3 TANGENT

Tangente, die von einer Vertex-Funktion kommt.

inout vec3 BINORMAL

Binormal, das von einer Vertex-Funktion stammt.

out vec3 NORMALMAP

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

out float NORMALMAP_DEPTH

Tiefe von der Variablen oben. Standardwert 1.0.

in vec2 UV

UV, das von einer Vertex-Funktion stammt.

in vec2 UV2

UV2, das von einer Vertex-Funktion stammt.

in bool OUTPUT_IS_SRGB

wahr, wenn Berechnungen im sRGB-Farbraum erfolgen (wahr in GLES2, `falsch in GLES3).

in vec4 COLOR

FARBE, die von einer Vertex-Funktion stammt.

out vec3 ALBEDO

Albedo (Standard Weiß).

out float ALPHA

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

out float ALPHA_SCISSOR

Beim Beschreiben werden Werte unter einem bestimmten Alpha-Wert verworfen.

out float METALLIC

Metallisch (0..1).

out float SPECULAR

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

out float ROUGHNESS

Unebenheit (0..1).

out float RIM

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

out float RIM_TINT

Rim Tint, goes from 0 (white) to 1 (albedo). If used, Godot calculates rim lighting.

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 Spiegelklecks entsprechend dem Tangentenraum.

out vec2 ANISOTROPY_FLOW

Verzerrungsrichtung, mit Flowmaps verwenden.

out float SSS_STRENGTH

Stärke der Streuung unter der Oberfläche. Bei Verwendung wird die Untergrundstreuung auf das Objekt angewendet.

out vec3 TRANSMISSION

Übertragungsmaske (Standard 0,0,0). Lässt Licht durch das Objekt hindurch. Wird nur bei Nutzung angewendet.

out vec3 EMISSION

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

out float AO

Stärke der Umgebungsokklusion. Zur Verwendung mit vorgebranntem AO.

out float AO_LIGHT_AFFECT

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

sampler2D SCREEN_TEXTURE

Eingebaute Textur zum Lesen vom Bildschirm. Mipmaps enthalten zunehmend unscharfe Kopien.

sampler2D DEPTH_TEXTURE

Eingebaute Textur zum Lesen der Tiefe vom Bildschirm. Muss mit INV_PROJECTION in linear umgewandelt werden.

out float DEPTH

Benutzerdefinierter Tiefenwert (0..1).

in vec2 SCREEN_UV

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

in vec2 POINT_COORD

Punktkoordinate zum Zeichnen von Punkten mit POINT_SIZE.

Eingebaute Beleuchtungsarten

Writing light processor functions is completely optional. You can skip the light function by setting render_mode to unshaded. If no light function is written, Godot will use the material properties written to in the fragment function to calculate the lighting for you (subject to the render_mode).

To write a light function, assign something to DIFFUSE_LIGHT or SPECULAR_LIGHT. Assigning nothing means no light is processed.

The light function is called for every light in every pixel. It is called within a loop for each light type.

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 * ALBEDO;
}

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

Warnung

The light() function won't be run if the vertex_lighting render mode is enabled, or if Rendering > Quality > Shading > Force Vertex Shading is enabled in the Project Settings. (It's enabled by default on mobile platforms.)

integriert

Beschreibung

in float TIME

Verstrichene Gesamtzeit in Sekunden.

in vec2 VIEWPORT_SIZE

Größe des Anzeigebereichs (in Pixeln).

in vec4 FRAGCOORD

Coordinate of pixel center in screen space. xy specifies position in window, z specifies fragment depth if DEPTH is not used. Origin is lower-left.

in mat4 WORLD_MATRIX

Modellraum in Weltenraum umwandeln.

in mat4 INV_CAMERA_MATRIX

Weltenraum in Modellraum umwandeln.

in mat4 CAMERA_MATRIX

Ansichtsbereich in Weltenraum umwandeln.

in mat4 PROJECTION_MATRIX

Ansichtsbereich im Ausschnittsbereich umwandeln.

in mat4 INV_PROJECTION_MATRIX

Ausschnittsbereich in Ansichtsbereich umwandeln.

in vec3 NORMAL

Normalvektor im sichtbaren Raum.

in vec2 UV

UV, das von einer Vertex-Funktion stammt.

in vec2 UV2

UV2, das von einer Vertex-Funktion stammt.

in vec3 VIEW

Sichtvektor im sichtbaren Raum.

in vec3 LIGHT

Lichtvektor im sichtbaren Raum.

in vec3 ATTENUATION

Dämpfung basierend auf Entfernung oder Schatten.

in bool OUTPUT_IS_SRGB

wahr, wenn Berechnungen im sRGB-Farbraum erfolgen (wahr in GLES2, `falsch in GLES3).

in vec3 ALBEDO

Basis Albedo.

in vec3 LIGHT_COLOR

Lichtfarbe multipliziert mit Energie.

out float ALPHA

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

in float ROUGHNESS

Unebenheit.

in vec3 TRANSMISSION

Übertragungsmaske der Fragment-Funktion.

out vec3 DIFFUSE_LIGHT

Diffuses Lichtergebnis.

out vec3 SPECULAR_LIGHT

Spiegelndes Lichtergebnis.