Android Graphics Shading Language (AGSL) to język używany w Androidzie 13 i nowszych do definiowania zachowania programowalnych obiektów RuntimeShader
. AGSL korzysta w znacznej części z cieniowania fragmentów GLSL, ale działa w systemie renderowania grafiki na Androidzie, aby dostosowywać malowanie w obrębie Canvas
i filtrować treści w View
.
Teoria działania
Efekty AGSL są częścią większego potoku graficznego Androida. Gdy Android wykonuje operację rysowania przyspieszoną z użyciem GPU, montuje pojedynczy cieniowanie fragmentów GPU, aby wykonać wymaganą pracę. Ten program do cieniowania składa się zwykle z kilku części. Może to obejmować na przykład:
- Określanie, czy piksel wpada na rysowany kształt czy poza niego (lub na obramowanie, gdzie może zostać zastosowany anti-aliasing).
- Sprawdzanie, czy piksel znajduje się wewnątrz czy na zewnątrz obszaru przycinania (ponownie z możliwością antyaliasingu w przypadku pikseli obramowania).
- Logika
Shader
naPaint
. Shader może być w rzeczywistości drzewem obiektów (ze względu naComposeShader
i inne funkcje opisane poniżej). - Podobna logika w przypadku elementu
ColorFilter
. - Kod łączenia (w przypadku niektórych typów
BlendMode
). - Kod konwersji przestrzeni kolorów w ramach zarządzania kolorami na Androidzie.
- Gdy
Paint
ma złożone drzewo obiektów w polachShader
,ColorFilter
lubBlendMode
, dostępny jest tylko 1 cieniowanie fragmentów GPU. Każdy węzeł w tym drzewie tworzy jedną funkcję. Kod przycinania i kod geometrii tworzą funkcję. Kod łączenia może utworzyć funkcję. Ogólny cieniowanie fragmentów wywołuje wszystkie te funkcje (które mogą wywoływać inne funkcje, np. w przypadku drzewa do cieniowania).
Efekt AGSL współtworzy funkcję (lub funkcje) do cieniowania fragmentów GPU.
Podstawowa składnia
AGSL (i GLSL) to języki typowe dla domen w stylu C. Typy takie jak bool
i int
ściśle śledzą swoje odpowiedniki C. Istnieją dodatkowe typy obsługujące wektory i macierze, które obsługują funkcje domeny.
Aby uzyskać wskazówki dotyczące dokładności, kwalifikatory można stosować do typów w sposób charakterystyczny dla języków cieniowania. Struktury kontrolne, takie jak instrukcje if-else
, działają podobnie jak w języku C. Język umożliwia też obsługę instrukcji switch
i pętli for
z ograniczeniami. Niektóre struktury sterujące wymagają wyrażeń stałych, które mogą być oceniane podczas kompilacji.
AGSL obsługuje funkcje, a każdy program do cieniowania zaczyna się od funkcji main
.
Funkcje zdefiniowane przez użytkownika są obsługiwane bez obsługi jakiejkolwiek rekurencji.
Funkcje korzystają ze konwencji wywoływania funkcji „wartość zwracana”. Wartości przekazywane do funkcji są kopiowane do parametrów po jej wywołaniu, a wyniki są kopiowane z powrotem. Zależą one od kwalifikatorów in
, out
i inout
.