Shaders spatiaux

Les shaders spatiaux sont utilisés pour l'ombrage des objets 3D. Ce sont les shaders les plus complexes proposés par Godot. Les shaders spatiaux sont hautement configurables avec différents modes de rendu et différentes options de rendu (par exemple, transluminescence, transmission, occlusion ambiante, éclairage de bordure, etc.). Les utilisateurs peuvent éventuellement écrire des fonctions de processeur de vertex, de fragment et de lumière pour affecter la façon dont les objets sont dessinés.

Mode de rendu

Mode de rendu

Description

blend_mix

Mode de fusion par mélange (alpha est la transparence), par défaut.

blend_add

Mode de fusion additif.

blend_sub

Mode de fusion substractif.

blend_mul

Mode de fusion multiplicatif.

depth_draw_opaque

Rend seulement la profondeur pour la géométrie opaque (non-transparente).

depth_draw_always

Rend toujours la profondeur (opaque et transparent).

depth_draw_never

Ne rend jamais la profondeur.

depth_draw_alpha_prepass

Fait un pré-passage de profondeur opaque pour les géométries transparentes.

depth_test_disable

Désactive le test de profondeur.

cull_front

Élimine les faces avant.

cull_back

Élimine les faces arrière (par défaut).

cull_disabled

Élimination des faces désactivé (double face).

unshaded

Le résultat est juste l'albedo. Pas d'éclairage/d'ombres n'a lieu dans le matériau.

diffuse_lambert

Ombrage de Lambert pour la diffuse (par défaut).

diffuse_lambert_wrap

Emballage Lambert (dépendant de la rugosité) pour la diffuse.

diffuse_oren_nayar

Oren Nayar pour la diffuse.

diffuse_burley

Burley (Disney PBS, ombrage basé sur la physique) pour la diffuse.

diffuse_toon

Ombrage toon pour la diffuse.

specular_schlick_ggx

Schlick-GGX pour la spéculaire (par défaut).

specular_blinn

Blinn pour la spéculaire (compatibilité).

specular_phong

Phong pour la spéculaire (compatibilité).

specular_toon

Toon pour la spéculaire.

specular_disabled

Désactive la spéculaire.

skip_vertex_transform

VERTEX/NORMAL/etc... doivent être transformés manuellement dans la fonction de vertex.

world_vertex_coords

VERTEX/NORMAL/etc... sont modifiés en coordonnées globales au lieu de locales.

ensure_correct_normals

À utiliser lorsqu'une échelle non uniforme est appliquée au maillage.

vertex_lighting

Utilise un éclairage basé sur les sommets.

shadows_disabled

Désactive le calcul des ombres dans le shader.

ambient_light_disabled

Désactive la contribution de la lumière ambiante et de la carte de radiance.

shadow_to_opacity

L'éclairage modifie la transparence alpha de sorte que les zones ombrées soient opaques et les zones non ombrées soient transparentes. Cela peut servir à surimposer des ombres sur des images fournie par une caméra en réalité augmentée.

Variables intégrées

Les valeurs marquées comme "in" sont en lecture seule. Les valeurs marquées comme "out" sont pour l'écriture facultative et ne contiendront pas nécessairement de valeurs sensibles. Les valeurs marquées comme "inout" fournissent une valeur par défaut sensible et peuvent éventuellement être réécrites. Les échantillonneurs ne sont pas soumis à l'écriture et ne sont pas marqués.

Variables intégrées Globales

Les modules intégrés globaux sont disponibles partout, y compris dans les fonctions personnalisées.

Intégré

Description

in float TIME

Temps global, en secondes.

Variables intégrées de sommet

Les données de sommet (VERTEX, NORMAL, TANGENT, BITANGENT) sont présentées dans l'espace de modèle local. Si elles ne sont pas réécrites, ces valeurs ne seront pas modifiées et seront transmises telles quelles.

Elles peuvent optionnellement être présentées dans l'espace global en utilisant le mode de rendu world_vertex_coords.

Les utilisateurs peuvent désactiver la transformation modèle-vue intégrée (la projection aura quand même lieu plus tard) et s'en occuper manuellement avec le code suivant :

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
}

D'autres variables intégrées, telles que UV, UV2 et COLOR, sont aussi directement transmises à la fonction de fragment si elles ne sont pas modifiées.

Les utilisateurs peuvent remplacer les transformations modèle-vue et projection à l'aide de la variable intégrée POSITION. Lorsque POSITION est utilisée, la valeur de VERTEX est ignorée et la projection ne se produit pas. Cependant, la valeur transmise à la fonction de fragment provient toujours de VERTEX.

Pour l'instanciation, la variable INSTANCE_CUSTOM contient les données personnalisées de l'instance. Pour des particules, cette information est habituellement :

  • x : Angle de rotation en radians.

  • y : Phase pendant la durée de vie (0 à 1).

  • z : Trame d'animation.

Cela permet d'ajuster facilement le shader à un système de particules en utilisant un matériau de particules par défaut. Lorsque vous écrivez un shader de particules personnalisé, cette valeur peut être utilisée comme vous le souhaitez.

Intégré

Description

in vec2 VIEWPORT_SIZE

Taille de la fenêtre d'affichage (en pixels).

inout mat4 WORLD_MATRIX

Transformation de l'espace de modèle à l'espace global.

in mat4 INV_CAMERA_MATRIX

Transformation de l'espace global à l'espace de vue.

inout mat4 PROJECTION_MATRIX

Transformation de l'espace de vue à l'espace de découpage.

in mat4 CAMERA_MATRIX

Transformation de l'espace de vue à l'espace global.

inout mat4 MODELVIEW_MATRIX

Transformation de l'espace de modèle à l'espace de vue (à utiliser si possible).

inout mat4 INV_PROJECTION_MATRIX

Transformation de l'espace de découpage à l'espace de vue.

inout vec3 VERTEX

Sommet en coordonnées locales.

out vec4 POSITION

Si réécrit, remplace la position finale du sommet.

inout vec3 NORMAL

Normale en coordonnées locales.

inout vec3 TANGENT

Tangente en coordonnées locales.

inout vec3 BINORMAL

Binormale en coordonnées locales.

out float ROUGHNESS

Rugosité pour l'éclairage du sommet.

inout vec2 UV

Canal UV principal.

inout vec2 UV2

Canal UV secondaire.

in bool OUTPUT_IS_SRGB

true lorsque les calculs ont lieu dans l'espace colorimétrique sRGB (true dans GLES2, false dans GLES3).

inout vec4 COLOR

Couleur des sommets.

inout float POINT_SIZE

Taille des points pour le rendu en points.

in int INSTANCE_ID

Identifiant de l'instance pour l'instanciation.

in vec4 INSTANCE_CUSTOM

Données personnalisées de l'instance (pour les particules, principalement).

Note

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.

Variables intégrées de fragment

L'utilisation par défaut d'une fonction de processeur de fragments dans Godot consiste à configurer les propriétés des matériaux de votre objet et à laisser le rendu intégré gérer l'ombrage final. Cependant, vous n'êtes pas obligé d'utiliser toutes ces propriétés, et si vous ne les écrivez pas, Godot optimisera les fonctionnalités correspondantes.

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.

Note

Une alternative communément utilisée à WORLD_MATRIX[3].xyz est vec3 origin = (WORLD_MATRIX * vec4(0,0,0,1)).xyz. Il est plus efficace d'utiliser ``WORLD_MATRIX[3].xyz``afin d'éviter la multiplication de matrice.

Intégré

Description

in vec2 VIEWPORT_SIZE

Taille de la fenêtre d'affichage (en pixels).

in vec4 FRAGCOORD

Coordonnées du centre du pixel dans l'espace d'écran. xy spécifie la position dans la fenêtre, z spécifie la profondeur du fragment si DEPTH n'est pas utilisé. L'origine est en bas à gauche.

dans mat4 WORLD_MATRIX

Transformation de l'espace de modèle à l'espace global.

in mat4 INV_CAMERA_MATRIX

Transformation de l'espace global à l'espace de vue.

in mat4 CAMERA_MATRIX

Transformation de l'espace de vue à l'espace global.

in mat4 PROJECTION_MATRIX

Transformation de l'espace de vue à l'espace de découpage.

in mat4 INV_PROJECTION_MATRIX

Transformation de l'espace de découpage à l'espace de vue.

in vec3 VERTEX

Vertex qui provient de la fonction vertex (par défaut, dans l'espace de vue).

in vec3 VIEW

Vecteur de la caméra à la position du fragment (dans l'espace de vue).

in bool FRONT_FACING

true si la face actuelle est la face avant.

inout vec3 NORMAL

Normale qui provient de la fonction de sommet (par défaut, dans l'espace de vue).

inout vec3 TANGENT

Tangente qui provient de la fonction de sommet.

inout vec3 BINORMAL

Binormale qui provient de la fonction de sommet.

out vec3 NORMALMAP

Réglez la normale ici si vous lisez la normale à partir d'une texture au lieu de NORMAL.

out float NORMALMAP_DEPTH

Profondeur de la variable du dessus. Par défaut 1.0.

in vec2 UV

UV qui provient de la fonction de sommet.

in vec2 UV2

UV2 qui provient de la fonction de sommet.

in bool OUTPUT_IS_SRGB

true lorsque les calculs ont lieu dans l'espace colorimétrique sRGB (true dans GLES2, false dans GLES3).

in vec4 COLOR

COLOR qui provient de la fonction de sommet.

out vec3 ALBEDO

Albédo (blanc par défaut).

out float ALPHA

Alpha (0..1). En cas d'écriture, le matériau passera dans le processus de transparence.

out float ALPHA_SCISSOR

En cas d'écriture, les valeurs inférieures à une certaine quantité d'alpha sont rejetées.

out float METALLIC

Métallicité (0..1).

out float SPECULAR

Spéculaire. La valeur par défaut est 0.5, il est préférable de ne pas modifier à moins que vous ne souhaitiez changer d'IOR.

out float ROUGHNESS

Rugosité (0..1).

out float RIM

Bordure (0..1) Si elle est utilisée, Godot calcule l'éclairage de bordure.

out float RIM_TINT

Tinte de Bordure, de 0 (blanc) à 1 (albédo). Si elle est utilisée, Godot calcule l'éclairage de bordure.

out float CLEARCOAT

Petite touche spéculaire ajoutée. Si elle est utilisée, Godot calcule le Clearcoat.

out float CLEARCOAT_GLOSS

Brillance du Clearcoat. Si elle est utilisée, Godot calcule le Clearcoat.

out float ANISOTROPY

Pour déformer la touche spéculaire en fonction de l'espace de tangente.

out vec2 ANISOTROPY_FLOW

Direction de la distorsion, à utiliser avec les flowmaps.

out float SSS_STRENGTH

Force de la Transluminescence. Si elle est utilisée, la Transluminescence sera appliquée à l'objet.

out vec3 TRANSMISSION

Masque de transmission (par défaut 0,0,0). Permet à la lumière de traverser l'objet. Appliqué uniquement s'il est utilisé.

out vec3 EMISSION

Couleur d'émission (peut aller au-delà de 1,1,1 pour le HDR).

out float AO

Force de l'occlusion ambiante. A utiliser avec l'occlusion ambiante précalculée.

out float AO_LIGHT_AFFECT

Combien l'occlusion ambiante affecte les lumières (0..1, par défaut 0).

sampler2D SCREEN_TEXTURE

Texture intégrée pour lire depuis l'écran. Les mipmaps contiennent des copies de plus en plus floues.

sampler2D DEPTH_TEXTURE

Texture intégrée pour lire la profondeur depuis l'écran. Doit être converti en linéaire en utilisant INV_PROJECTION.

out float DEPTH

Valeur de profondeur personnalisée (0..1). Si DEPTH est écrit dans une branche de shader, alors vous êtes responsable de la mise en place de DEPTH pour toutes les autres branches. Sinon, l'API graphique les laissera non initialisées.

in vec2 SCREEN_UV

Coordonnées UV de l'écran pour le pixel actuel.

in vec2 POINT_COORD

Coordonnées de point pour dessiner des points avec POINT_SIZE.

Note

Les shaders passant par le pipeline transparent lorsque ALPHA est écrit peuvent présenter des problèmes de tri par transparence. Lisez la section tri par transparence dans la page des limitations de rendu 3D pour plus d'informations et moyens d'éviter les problèmes.

Variables intégrées de lumière

L'écriture des fonctions du processeur de lumière est totalement optionnelle. Vous pouvez sauter la fonction lumière en réglant render_mode sur "unshaded". Si aucune fonction lumière n'est écrite, Godot utilisera les propriétés matérielles écrites dans la fonction fragment pour calculer l'éclairage pour vous (sous réserve du render_mode).

Pour écrire une fonction lumière, assignez quelque chose à DIFFUSE_LIGHT ou SPECULAR_LIGHT. Ne rien assigner signifie qu'aucune lumière n'est traitée.

La fonction lumière est appelée pour chaque lumière dans chaque pixel. Elle est appelé dans une boucle pour chaque type de lumière.

Vous trouverez ci-dessous un exemple de fonction lumière personnalisée utilisant un modèle d'éclairage Lambertien :

void light() {
    DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * ALBEDO;
}

Si vous voulez que les lumières s'additionnent, ajoutez la contribution de la lumière à DIFFUSE_LIGHT en utilisant +=, plutôt que de l'écraser.

Avertissement

En GLES2, les lumières seront toujours additionnées, même si vous remplacez DIFFUSE_LIGHT par =. Cela est dû au fait que l'éclairage est calculé en plusieurs passes (une pour chaque lumière), contrairement à GLES3.

Avertissement

La fonction light() ne sera pas exécutée si le mode de rendu vertex_lighting est activé, ou si Rendering > Quality > Shading > Force Vertex Shading est activé dans les paramètres du projet. (C'est activée par défaut sur les plateformes mobiles.)

Intégré

Description

in float TIME

Temps total écoulé en secondes.

in vec2 VIEWPORT_SIZE

Taille de la fenêtre d'affichage (en pixels).

in vec4 FRAGCOORD

Coordonnées du centre du pixel dans l'espace de l'écran. xy indique la position dans la fenêtre, z indique la profondeur du fragment si DEPTH n'est pas utilisé. L'origine est en bas à gauche.

dans mat4 WORLD_MATRIX

Transformation de l'espace de modèle à l'espace global.

in mat4 INV_CAMERA_MATRIX

Transformation de l'espace global à l'espace de vue.

in mat4 CAMERA_MATRIX

Transformation de l'espace de vue à l'espace global.

in mat4 PROJECTION_MATRIX

Transformation de l'espace de vue à l'espace de découpage.

in mat4 INV_PROJECTION_MATRIX

Transformation de l'espace de découpage à l'espace de vue.

in vec3 NORMAL

Vecteur Normal, dans l'espace de vue.

in vec2 UV

UV qui provient de la fonction de sommet.

in vec2 UV2

UV2 qui provient de la fonction de sommet.

in vec3 VIEW

Vecteur Vue, dans l'espace de vue.

in vec3 LIGHT

Vecteur Lumière, dans l'espace de vue.

in vec3 ATTENUATION

Atténuation basée sur la distance ou l'ombre.

in bool OUTPUT_IS_SRGB

true lorsque les calculs ont lieu dans l'espace colorimétrique sRGB (true dans GLES2, false dans GLES3).

in vec3 ALBEDO

Albédo de base.

in vec3 LIGHT_COLOR

Couleur de la lumière multipliée par l'énergie.

out float ALPHA

Alpha (0..1). En cas d'écriture, le matériau passera dans le processus de transparence.

in float ROUGHNESS

Rugosité.

in vec3 TRANSMISSION

Masque de transmission de la fonction fragment.

out vec3 DIFFUSE_LIGHT

Résultat de la lumière diffuse.

out vec3 SPECULAR_LIGHT

Résultat de la lumière spéculaire.

Note

Les shaders passant par le pipeline transparent lorsque ALPHA est écrit peuvent présenter des problèmes de tri par transparence. Lisez la section tri par transparence dans la page des limitations de rendu 3D pour plus d'informations et moyens d'éviter les problèmes.