Android Graphics Shading Language (AGSL)

Le langage AGSL (Android Graphics Shading Language) est utilisé par Android 13 et versions ultérieures pour définir le comportement des objets RuntimeShader programmables. AGSL partage une grande partie de sa syntaxe avec les nuanceurs de fragments GLSL, mais fonctionne dans le système de rendu graphique Android pour personnaliser la peinture dans Canvas et filtrer le contenu View.

Théorie du fonctionnement

Les effets AGSL s'inscrivent dans le pipeline graphique Android plus vaste. Lorsqu'Android lance une opération de dessin accélérée par le GPU, il assemble un seul nuanceur de fragment GPU pour effectuer le travail requis. Ce nuanceur comprend généralement plusieurs éléments. Voici quelques exemples:

  • Évaluer si un pixel se trouve à l'intérieur ou à l'extérieur de la forme dessinée (ou sur la bordure, où il peut appliquer un anticrénelage)
  • Évaluer si un pixel se trouve à l'intérieur ou à l'extérieur de la zone de rognage (encore une fois, avec une logique d'anticrénelage possible pour les pixels de bordure).
  • Logique de Shader sur Paint. Le nuanceur peut en fait être une arborescence d'objets (grâce à ComposeShader et à d'autres fonctionnalités décrites ci-dessous).
  • Logique similaire pour ColorFilter.
  • Combinaison du code (pour certains types de BlendMode)
  • Code de conversion de l'espace colorimétrique, dans le cadre de la gestion des couleurs d'Android.
  • Lorsque Paint comporte une arborescence complexe d'objets dans les champs Shader, ColorFilter ou BlendMode, il n'existe toujours qu'un seul nuanceur de fragments GPU. Chaque nœud de cette arborescence crée une seule fonction. Le code de découpage et le code géométrique créent chacun une fonction. Le code de combinaison peut créer une fonction. Le nuanceur de fragments global appelle ensuite toutes ces fonctions (qui peuvent appeler d'autres fonctions, par exemple dans le cas d'une arborescence de nuanceurs).

Votre effet AGSL contribue à une ou plusieurs fonctions dans le nuanceur de fragments du GPU.

Syntaxe de base

AGSL (et GLSL) sont des langages spécifiques au domaine C. Les types tels que bool et int suivent de près leurs équivalents C. Il existe d'autres types pour prendre en charge les vecteurs et les matrices compatibles avec les fonctionnalités du domaine.

Les qualificatifs peuvent être appliqués aux types pour obtenir des indications de précision, d'une manière qui est propre aux langues d'ombrage. Les structures de contrôle telles que les instructions if-else fonctionnent de la même manière qu'en C. Le langage est également compatible avec les instructions switch et les boucles for avec des limites. Certaines structures de contrôle nécessitent des expressions constantes pouvant être évaluées au moment de la compilation.

AGSL est compatible avec les fonctions. Chaque programme de nuanceur commence par la fonction main. Les fonctions définies par l'utilisateur sont prises en charge, mais aucune récursion n'est prise en charge. Les fonctions utilisent une convention d'appel de type "valeur-retour". Les valeurs transmises aux fonctions sont copiées dans les paramètres lors de l'appel de la fonction, et les sorties sont copiées. Ce comportement est déterminé par les qualificatifs in, out et inout.