CanvasItem shaders¶
Les shaders de type CanvasItem sont utilisés pour dessiner tous les éléments 2D dans Godot. Ceux-ci incluent tous les nœuds qui héritent de CanvasItems, et tous les éléments d'interface graphique.
Les shaders de type CanvasItem contiennent moins de variables et fonctionnalités intégrées que les shaders spatiaux, mais ils conservent la même structure de base avec les fonctions vertex, fragment, et light processor.
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. |
blend_premul_alpha |
Mode de mélange alpha pré-multiplié. |
blend_disabled |
Désactive le mélange, les valeurs (y compris l'alpha) sont écrites telles quelles. |
unshaded |
Le résultat est juste l'albedo. Pas d'éclairage/d'ombres n'a lieu dans le matériau. |
light_only |
Ne dessinez que lors des passes de lumière. |
skip_vertex_transform |
VERTEX/NORMAL/etc doivent être transformés manuellement dans la fonction vertex. |
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 depuis le démarrage du moteur, en secondes (toujours positif). Il est soumis au paramètre de renversement (qui est de 3600 secondes par défaut). Il n'est pas affecté par time_scale<class_Engine_property_time_scale>`ou la pause, mais vous pouvez remplacer l'échelle de temps de la variable ``TIME` en appelant |
Variables intégrées de sommet¶
Les données des sommets (VERTEX
) sont présentées dans l'espace local (coordonnées des pixels, par rapport à la caméra). Si elles ne sont pas écrites, ces valeurs ne seront pas modifiées et seront transmises comme elles sont venues.
L'utilisateur peut désactiver la transformation modelview intégrée (la projection se produira tout de même plus tard) et la faire manuellement avec le code suivant :
shader_type canvas_item;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (WORLD_MATRIX * (EXTRA_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy;
}
Note
WORLD_MATRIX
est en fait une matrice Modelview. Elle prend ses entrées dans l'espace local et les transforme en données de l'espace visuel.
Afin d'obtenir les coordonnées d'un vertex dans l'espace monde, il faut le passer dans une constante Uniform personnalisée de la manière suivante :
material.set_shader_param("global_transform", get_global_transform())
Ensuite, dans votre vertex shader :
uniform mat4 global_transform;
varying vec2 world_position;
void vertex(){
world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
}
world_position
peut ensuite être utilisé dans les fonctions vertex ou fragment.
D'autres types intégrées, comme UV et COLOR, sont aussi passé tel quel à la fonction fragment s'ils ne sont pas modifiés.
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.
Intégré |
Description |
---|---|
dans mat4 WORLD_MATRIX |
Transformation de l'espace Image vers l'espace de vue. |
dans mat4 EXTRA_MATRIX |
Transformation supplémentaire. |
in mat4 PROJECTION_MATRIX |
Transformation de l'espace de vue à l'espace de découpage. |
in vec4 INSTANCE_CUSTOM |
Données personnalisées de l'instance. |
in bool AT_LIGHT_PASS |
|
inout vec2 VERTEX |
Sommet, dans l'espace Image. |
in vec2 TEXTURE_PIXEL_SIZE |
Taille de pixel normalisée de la texture 2D par défaut. Pour un Sprite d'une résolution de 64x32px, TEXTURE_PIXEL_SIZE = |
inout vec2 UV |
Coordonnées de texture. |
inout vec4 COLOR |
Couleur du sommet primitif. |
in vec4 MODULATE |
Modulation finale de la couleur. Si elle est utilisée, COLOR ne sera pas multipliée par la modulation automatiquement après la fonction de fragment. |
inout float POINT_SIZE |
Taille des points pour le dessin de point. |
Variables intégrées de fragment¶
Certains nœuds ( Sprites par exemple) affichent une texture par défaut. Toutefois, lorsqu'une fonction fragment personnalisée est attachée à ces nœuds, l'affectation de texture doit être faite manuellement. Godot ne fournit pas la couleur de la texture dans la variable intégrée COLOR
; pour lire la couleur de la texture de ces nœuds, utilisez :
COLOR = texture(TEXTURE, UV);
Ce comportement diffère de celui de la normal map intégrée. Si une normal map est attachée, Godot l'utilise par défaut et l'assigne à la variable intégrée NORMAL
. Si vous utilisez une normal map destinée à être utilisée en 3D, elle apparaîtra inversée. Pour l'utiliser dans votre shader, vous devez l'affecter à la propriété NORMALMAP
. Godot se chargera de la convertir pour l'utiliser en 2D et réécrira la propriété NORMAL
.
NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;
Intégré |
Description |
---|---|
in vec4 FRAGCOORD |
Coordonnées du centre du pixel. Dans l'espace écran. |
inout vec3 NORMAL |
Normale lue à partir de NORMAL_TEXTURE. Accessible en écriture. |
out vec3 NORMALMAP |
Configure les normal maps (cartes de normales) destinées à la 3D pour une utilisation en 2D. S'il est utilisé, remplace NORMAL. |
inout float NORMALMAP_DEPTH |
Profondeur d'une Normalmap pour la mise à l'échelle. |
in vec2 UV |
UV de la fonction vertex. |
inout vec4 COLOR |
Couleur issue de la fonction de sommet et couleur du fragment en sortie. Si elle n'est pas utilisée, elle sera réglée sur la couleur de la TEXTURE. |
in vec4 MODULATE |
Modulation finale de la couleur. Si elle est utilisée, COLOR ne sera pas multipliée par la modulation automatiquement après la fonction de fragment. |
in sampler2D TEXTURE |
Texture 2D par défault. |
in sampler2D NORMAL_TEXTURE |
Texture 2D des normales par défaut. |
in vec2 TEXTURE_PIXEL_SIZE |
Taille de pixel normalisée de la texture 2D par défaut. Pour un Sprite d'une résolution de 64x32px, TEXTURE_PIXEL_SIZE = |
in vec2 SCREEN_UV |
Écran UV pour utilisation avec SCREEN_TEXTURE. |
in vec2 SCREEN_PIXEL_SIZE |
Taille des pixels individuels. Égal à l'inverse de la résolution. |
in vec2 POINT_COORD |
Coordonnées pour dessiner les points. |
in bool AT_LIGHT_PASS |
|
in sampler2D SCREEN_TEXTURE |
Texture de l'écran, les mipmaps contiennent des versions floues gaussiennes. |
Variables intégrées de lumière¶
Les fonctions du processeur de lumière fonctionnent différemment en 2D qu'en 3D. Dans les shaders de CanvasItem, le shader est appelé une fois pour l'objet dessiné, puis une fois pour chaque lumière touchant cet objet dans la scène. Utilisez le mode render_mode unshaded
si vous ne voulez pas que la lumière soit calculée pour cet objet. Utilisez le mode render_mode light_only
si vous voulez que seule la lumière soit calculée pour cet objet ; ceci peut être utile lorsque vous voulez que l'objet ne soit visible que là où il est couvert de lumière.
Si le shader laisse passer la lumière, la variable AT_LIGHT_PASS
sera assignée à true
.
Intégré |
Description |
---|---|
in vec4 FRAGCOORD |
Coordonnées du centre du pixel. Dans l'espace écran. |
in vec3 NORMAL |
Normale d'entrée. Bien que cette valeur soit transmise, le calcul de la normale se produit toujours en dehors de cette fonction. |
in vec2 UV |
UV de la fonction vertex, équivalent à l'UV dans la fonction de fragment. |
in vec4 COLOR |
Input Color. C'est la sortie de la fonction de fragment (avec la modulation finale appliquée, si MODULATE n'est utilisé dans aucune fonction du shader). |
in vec4 MODULATE |
Modulation finale de la couleur. Si elle est utilisée, COLOR ne sera pas multipliée par la modulation automatiquement après la fonction de fragment. |
sampler2D TEXTURE |
Texture actuelle utilisée pour le CanvasItem. |
in vec2 TEXTURE_PIXEL_SIZE |
Taille de pixel normalisée de la texture 2D par défaut. Pour un Sprite d'une résolution de 64x32px, TEXTURE_PIXEL_SIZE = |
in vec2 SCREEN_UV |
SCREEN_TEXTURE Coordonnées (à utiliser avec la texture de l'écran). |
in vec2 POINT_COORD |
UV pour Point Sprite. |
inout vec2 LIGHT_VEC |
Vecteur de la lumière au fragment en coordonnées locales. Il peut être modifié pour modifier la direction d'éclairage lorsque des normal maps sont utilisées. |
inout vec2 SHADOW_VEC |
Vecteur de la lumière au fragment en coordonnées locales. Il peut être modifié pour modifier le calcul de l'ombre. |
inout float LIGHT_HEIGHT |
Hauteur de lumière. Seulement efficace lorsque les normales sont utilisées. |
inout vec4 LIGHT_COLOR |
Couleur de la lumière. |
in vec2 LIGHT_UV |
UV pour texture de lumière. |
out vec4 SHADOW_COLOR |
Couleur de l'ombre de la lumière. |
inout vec4 LIGHT |
Valeur de la texture de lumière et de la couleur en sortie. Peut être modifiée. Si elle n'est pas utilisée, la fonction d'éclairage est ignorée. |