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 |
|
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). |
Bemerkung
MODELVIEW_MATRIX
combines both the WORLD_MATRIX
and INV_CAMERA_MATRIX
and is better suited when floating point issues may arise. For example, if the object is very far away from the world origin, you may run into floating point issues when using the seperated WORLD_MATRIX
and INV_CAMERA_MATRIX
.
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.
Below are examples of common variables calculated using the built-ins:
vec3 model_world_space = WORLD_MATRIX[3].xyz; // Object's world space position. This is the equivalent to global_transform.origin in GDScript.
mat3 model_transform_basis = mat3(WORLD_MATRIX); // Object's world space transform basis. This is the equivalent to global_transform.basis in GDScript.
vec3 camera_world_space = CAMERA_MATRIX[3].xyz; // Camera's world space position. This is the equivalent to camera.global_transform.origin in GDScript.
vec3 camera_eye_world_space = INV_CAMERA_MATRIX[3].xyz; // Camera eye vector in world space direction of the camera.
vec3 camera_to_object_world_space = normalize(WORLD_MATRIX[3].xyz - CAMERA_MATRIX[3].xyz); // Camera's direction to the object in world space.
Bemerkung
A commonly used alternative to WORLD_MATRIX[3].xyz
is to use vec3 origin = (WORLD_MATRIX * vec4(0,0,0,1)).xyz
. It is more efficient to use WORLD_MATRIX[3].xyz
as it avoids the matrix multiplication.
integriert |
Beschreibung |
---|---|
in vec2 VIEWPORT_SIZE |
Größe des Anzeigebereichs (in Pixeln). |
in vec4 FRAGCOORD |
Coordinate of pixel center in screen space. |
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 |
|
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 |
|
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 |
Custom depth value (0..1). If |
in vec2 SCREEN_UV |
Bildschirm-UV-Koordinate für das aktuelle Pixel. |
in vec2 POINT_COORD |
Punktkoordinate zum Zeichnen von Punkten mit POINT_SIZE. |
Bemerkung
Shaders going through the transparent pipeline when ALPHA
is written to
may exhibit transparency sorting issues. Read the
transparency sorting section in the 3D rendering limitations page
for more information and ways to avoid issues.
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
In GLES2, lights will always be added together even if you override DIFFUSE_LIGHT
using =
. This is due to lighting being computed in multiple passes (one for each light), unlike GLES3.
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.
|
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 |
|
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. |
Bemerkung
Shaders going through the transparent pipeline when ALPHA
is written to
may exhibit transparency sorting issues. Read the
transparency sorting section in the 3D rendering limitations page
for more information and ways to avoid issues.