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 |
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);
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 |
|
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 |
|
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, |
in vec4 CUSTOM1 |
Custom value from vertex primitive. When using extra
UVs, |
in vec4 CUSTOM2 |
Custom value from vertex primitive. When using extra
UVs, |
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. |
in bool FRONT_FACING |
|
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 |
|
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 |
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 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. |
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).