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 |
in float TAU |
Eine |
in float E |
Eine |
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 |
|
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. |
in int VIEW_MONO_LEFT |
Konstante für Mono oder linkes Auge, immer |
in int VIEW_RIGHT |
Konstante für das rechte Auge, immer |
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. |
in bool FRONT_FACING |
|
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 |
|
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. |
in int VIEW_MONO_LEFT |
Konstante für Mono oder linkes Auge, immer |
in int VIEW_RIGHT |
Konstante für das rechte Auge, immer |
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 |
in vec2 SCREEN_UV |
Screen-UV-Koordinate für das aktuelle Pixel. |
sampler2D DEPTH_TEXTURE |
Entfernt in Godot 4. Verwenden Sie stattdessen ein |
out float DEPTH |
Benutzerdefinierter Tiefenwert (0..1). Wenn |
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. |
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 |
in float SPECULAR_AMOUNT |
2.0 * |
in bool LIGHT_IS_DIRECTIONAL |
|
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 |
|
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).