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. |
in vec3 NODE_POSITION_WORLD |
Node position, in world space. |
in vec3 NODE_POSITION_VIEW |
Node position, in view space. |
in vec3 CAMERA_POSITION_WORLD |
Camera position, in world space. |
in vec3 CAMERA_DIRECTION_WORLD |
Camera direction, in world space. |
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 |
|
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.
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. |
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 NODE_POSITION_WORLD |
Node world space position. |
in vec3 NODE_POSITION_VIEW |
Node view space position. |
in vec3 CAMERA_POSITION_WORLD |
Camera world space position. |
in vec3 CAMERA_DIRECTION_WORLD |
Camera world space direction. |
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 |
|
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 |
|
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 |
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. |
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 |
|
in vec3 ALBEDO |
Albédo de base. |
in vec3 LIGHT_COLOR |
Color of light multiplied by |
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.