Shaders

Introduction

Les shaders sont des programmes uniques qui tournent sur le GPU. Ils permettent de spécifier comment prendre les données du maillage (positions des sommets, couleurs, normales, etc.) et les dessiner à l'écran. Les shaders ne traitent pas les informations de la même manière qu'un programme normal car ils sont optimisés pour fonctionner sur le GPU. Une des conséquences de cette situation est que les shaders ne conservent pas leurs données après leur exécution ; ils émettent une couleur finale à l'écran et passent ensuite à l'étape suivante. Par conséquent, il n'y a aucun moyen d'accéder à la sortie couleur de la dernière passe du shader.

Godot utilise un langage de shader très similaire à GLSL, mais avec des fonctionnalités supplémentaires et un peu moins de flexibilité. La raison en est que Godot intègre des fonctionnalités intégrées pour faciliter considérablement l'écriture de shaders complexes. Godot enveloppe le code du shader écrit par l'utilisateur dans un code qui lui est propre. De cette façon, Godot gère beaucoup de choses de bas niveau dont l'utilisateur n'a pas à se soucier, et il est capable d'analyser votre code de shader et de l'utiliser pour affecter le pipeline de rendu. Pour les shaders plus avancés, vous pouvez désactiver cette fonctionnalité en utilisant un render_mode.

Ce document vous fournit quelques informations sur les shaders, spécifiques à Godot. Pour une référence détaillée du langage de shading dans Godot, voir  Godot shading language doc.

Types de shader

Au lieu de fournir une configuration générale pour tous les usages (2D, 3D, particules), les shaders Godot doivent préciser à quoi ils sont destinés. Différents types supportent différents modes de rendu, variables intégrées et fonctions de traitement.

Tous les shaders doivent spécifier leur type dans leur première ligne, dans le format suivant :

shader_type spatial;

Les types valides sont :

Pour des informations détaillées sur chaque type de shader, regardez la page de la documentation correspondante.

Mode de rendu

Différents types de shader supportent différents modes de rendu. Ils sont optionnels et, s’ils sont précisés, doivent être après le shader_type. Les modes de rendu sont utilisés pour modifier la manière dont les fonctionnalités intégrées sont gérées. Par exemple, il est courant d’utiliser le mode de rendu unshaded (sans ombres) pour sauter la fonction intégrée de traitement de la lumière.

Les modes de rendu sont spécifiés en dessous du type de shader :

shader_type spatial;
render_mode unshaded, cull_disabled;

Chaque type de shader a une liste différente de mode de rendus disponibles. Regardez la documentation de chaque type de shader pour une liste complète des modes de rendu.

Fonctions processeur

Selon le type de shader, différentes fonction processeur peuvent optionnellement être réécrites. Pour "spatial" et "canvas_item", il est possible de réécrire vertex, fragment, et light. Pour "particles", seul vertex peut être réécrit.

Processeur de sommet

La fonction processeur vertex est appelée une fois pour chaque sommet dans les shaders "spatial" et "canvas_item". Pour les shaders "particles", elle est appelée une fois pour chaque particule.

La fonction vertex est utilisée pour modifier les informations par vertex qui seront transmises à la fonction fragment. Il peut aussi être utilisé pour établir des variables qui seront envoyées à la fonction fragment en utilisant des varyings (voir autre doc).

Par défaut, Godot prendra les informations de votre vertex et les transformera en conséquence pour les dessiner. Si cela n'est pas souhaitable, vous pouvez utiliser les modes de rendu pour transformer les données vous-même ; voir le Spatial shader doc pour un exemple de ceci.

Processeur de fragments

La fonction de traitement des fragment permet de régler les paramètres du matériau Godot par pixel. Ce code s'exécute sur chaque pixel visible de l'objet ou du dessein primitif. Il n'est disponible que dans les shaders "spatial" et "canvas_item".

L'utilisation standard de la fonction de fragment consiste à définir les propriétés des matériaux qui seront utilisées pour calculer l'éclairage. Par exemple, vous pouvez définir des valeurs pour ROUGHNESS, RIM, ou TRANSMISSION qui indiquent à la fonction lumière comment les lumières réagissent à ce fragment. Cela permet de contrôler un pipeline de shading complexe sans que l'utilisateur n'ait à écrire beaucoup de code. Si vous n'avez pas besoin de cette fonctionnalité intégrée, vous pouvez l'ignorer et écrire votre propre fonction de traitement de la lumière et Godot l'optimisera. Par exemple, si vous n'écrivez pas de valeur à RIM, Godot ne calculera pas l'éclairage rim. Lors de la compilation, Godot vérifie si RIM est utilisé ; si ce n'est pas le cas, il coupe tout le code correspondant. Par conséquent, vous ne gaspillerez pas les calculs sur des effets que vous n'utilisez pas.

Processeur de lumière

Le processeur de light fonctionne aussi par pixel, mais aussi pour chaque lumière qui affecte l'objet (et ne fonctionne pas si aucune lumière n'affecte l'objet). Il existe sous la forme d'une fonction appelée à l'intérieur du processeur de fragment et opère typiquement sur les propriétés du matériau configurées à l'intérieur de la fonction fragment.

Le processeur light fonctionne différemment en 2D qu'en 3D ; pour une description de son fonctionnement dans chaque cas, voir leur documentation, CanvasItem shaders et Spatial shaders, respectivement.