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
ShadernaPaint. Shader może być w rzeczywistości drzewem obiektów (ze względu naComposeShaderi 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
Paintma złożone drzewo obiektów w polachShader,ColorFilterlubBlendMode, 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.