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).
sans ombre 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.

Variable intégrée 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 = (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.

Variable intégrée 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).

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.

Variable intégrée 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.
in 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).
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.

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

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.)

Variable intégrée 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.
in 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.