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
surPaint
. 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 champsShader
,ColorFilter
ouBlendMode
, 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
.