Android Graphics Shading Language (AGSL)

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 na Paint. Shader może być w rzeczywistości drzewem obiektów (ze względu na ComposeShader 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 polach Shader, ColorFilter lub BlendMode, 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.