Android Graphics Shading Language (AGSL) viene utilizzato da Android 13 e versioni successive per definire il comportamento degli oggetti RuntimeShader
programmabili. AGSL condivide gran parte della sua sintassi con gli ombreggiatori dei frammenti GLSL, ma funziona all'interno del sistema di rendering della grafica Android per personalizzare la pittura all'interno di Canvas
e filtrare i contenuti View
.
Teoria del funzionamento
Gli effetti AGSL fanno parte della più ampia pipeline grafica di Android. Quando Android emette un'operazione di disegno con accelerazione GPU, assembla un singolo Shader di frammenti GPU per svolgere il lavoro richiesto. Questo ombreggiatore include in genere diversi pezzi. Ad esempio:
- Valutare se un pixel cade all'interno o all'esterno della forma disegnata (o sul bordo, dove potrebbe essere applicato l'anti-aliasing).
- Valutare se un pixel rientra o meno all'interno o all'esterno dell'area di ritaglio (di nuovo, con logica di anti-aliasing possibile per i pixel del bordo).
- Logica per
Shader
sulPaint
. Shader può essere in realtà un albero di oggetti (a causa diComposeShader
e di altre funzionalità descritte di seguito). - Logica simile per
ColorFilter
. - Codice di combinazione (per alcuni tipi di
BlendMode
). - Codice di conversione dello spazio colore, nell'ambito della gestione dei colori di Android.
- Quando
Paint
ha un complesso albero di oggetti nei campiShader
,ColorFilter
oBlendMode
, c'è ancora un solo Shader frammento GPU. Ogni nodo nell'albero crea una singola funzione. Il codice di ritaglio e il codice geometrico creano ciascuno una funzione. Il codice di combinazione potrebbe creare una funzione. A questo punto, lo Shader dei frammenti chiama tutte queste funzioni (che potrebbero chiamare altre funzioni, ad esempio nel caso di un albero di Shader).
L'effetto AGSL contribuisce a una funzione (o più funzioni) al fragment Shader della GPU.
Sintassi di base
AGSL (e GLSL) sono lingue specifiche per i domini in stile C. Tipi come bool
e
int
tracciano molto attentamente i loro equivalenti C; ce ne sono altri tipi per
supportare vettori e matrici che supportano la funzionalità del dominio.
I qualificatori possono essere applicati ai tipi per ottenere suggerimenti di precisione, in modo univoco per le lingue di ombreggiatura. Le strutture di controllo come le istruzioni if-else
funzionano in modo molto
come in C; il linguaggio fornisce anche supporto per le istruzioni switch
e i loop for
con limitazioni. Alcune strutture di controllo richiedono espressioni costanti che possono essere valutate in fase di compilazione.
AGSL supporta le funzioni; ogni programma Shader inizia con la funzione main
.
Le funzioni definite dall'utente sono supportate, senza supporto per la ricorsione di qualsiasi tipo.
Le funzioni utilizzano una convenzione per le chiamate "value-return". I valori trasferiti alle funzioni vengono copiati nei parametri quando la funzione viene chiamata e gli output vengono copiati. Ciò è determinato dai qualificatori in
, out
e inout
.