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.

Variable intégrée

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 VisualServer.set_shader_time_scale() avec le facteur d'échelle de temps souhaité comme paramètre (1.0 étant la valeur 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

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;

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