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

Variable intégrée Description
in float TIME Temps global, en secondes. Il est soumis au paramètre de roulement (qui est de 3 600 -1 heure par défaut).

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 = (EXTRA_MATRIX * (WORLD_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.
Variable intégrée Description
in mat4 WORLD_MATRIX Transformation de l'espace Image vers l'espace de vue.
in 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 true s'il s'agit d'une passe de calcul de la lumière.
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 = vec2(1/64, 1/32)
inout vec2 UV UV.
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;
Variable intégrée Description
in vec4 FRAGCOORD Coordonnées du centre du pixel. Dans l'espace écran. xy indiquent la position dans la fenêtre, z retourne la profondeur du fragment si DEPTH n'est pas utilisé. L'origine est en bas à gauche.
inout vec3 NORMAL Normale lue à partir de NORMAL_TEXTURE. Accessible en écriture.
out vec3 NORMALMAP Configure les cartes 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 = vec2(1/64, 1/32)
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 true s'il s'agit d'une passe de calcul de la lumière.
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.

Variable intégrée Description
in vec4 FRAGCOORD Coordonnées du centre du pixel. Dans l'espace écran. xy indiquent la position dans la fenêtre, z retourne la profondeur du fragment si DEPTH n'est pas utilisé. L'origine est en bas à gauche.
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 = vec2(1/64, 1/32)
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.