Android Graphics Shading Language (AGSL)

Die Android Graphics Shading Language (AGSL) wird ab Android 13 verwendet, um das Verhalten programmierbarer RuntimeShader-Objekte zu definieren. AGSL verwendet einen Großteil seiner Syntax mit GLSL-Fragment-Shadern, funktioniert jedoch im Grafik-Rendering-System von Android, um sowohl das Painting innerhalb von Canvas anzupassen als auch View-Inhalte zu filtern.

Betriebstheorie

AGSL-Effekte sind Teil der größeren Android-Grafikpipeline. Wenn Android einen GPU-beschleunigten Zeichenvorgang ausgibt, wird ein einzelner GPU-Fragment-Shader erstellt, um die erforderliche Arbeit zu erledigen. Dieser Shader enthält in der Regel mehrere Teile. Beispiele:

  • Auswerten, ob ein Pixel innerhalb oder außerhalb der gezeichneten Form (oder auf den Rand, wo es Kantenglättung anwenden könnte) liegt.
  • Auswerten, ob ein Pixel innerhalb oder außerhalb des Beschneidungsbereichs liegt (auch hier mit einer möglichen Antialiasing-Logik für Rahmenpixel).
  • Logik für den Shader im Paint. Der Shader kann aufgrund von ComposeShader und anderen unten beschriebenen Funktionen eine Baumstruktur von Objekten sein.
  • Ähnliche Logik für ColorFilter.
  • Code zusammenführen (für bestimmte BlendMode-Typen)
  • Farbraum-Konvertierungscode im Rahmen des Farbmanagements von Android.
  • Wenn das Paint eine komplexe Baumstruktur von Objekten in den Feldern Shader, ColorFilter oder BlendMode hat, ist immer noch nur ein einzelner GPU-Fragment-Shader vorhanden. Jeder Knoten in dieser Baumstruktur erstellt eine einzelne Funktion. Der Beschneidungscode und der Geometriecode erstellen jeweils eine Funktion. Mit dem Code zum Zusammenführen können Sie eine Funktion erstellen. Der gesamte Fragment-Shader ruft dann alle diese Funktionen auf (was auch andere Funktionen aufrufen kann, z.B. im Fall eines Shader-Baums).

Ihr AGSL-Effekt trägt eine oder mehrere Funktionen zum Fragment-Shader der GPU bei.

Grundlegende Syntax

AGSL (und GLSL) sind domainspezifische Sprachen im C-Stil. Typen wie bool und int verfolgen ihre C-Äquivalente genau. Es gibt weitere Typen zur Unterstützung von Vektoren und Matrizen, die Domainfunktionen unterstützen.

Qualifizierer können auf Typen für Präzisionshinweise angewendet werden. Dies ist nur für Schattierungssprachen möglich. Steuerstrukturen wie if-else-Anweisungen funktionieren ähnlich wie in C. Die Sprache unterstützt außerdem switch-Anweisungen und for-Schleifen mit Einschränkungen. Einige Kontrollstrukturen erfordern konstante Ausdrücke, die bei der Kompilierung ausgewertet werden können.

AGSL unterstützt Funktionen. Jedes Shader-Programm beginnt mit der Funktion main. Benutzerdefinierte Funktionen werden ohne Unterstützung für Rekursionen jeglicher Art unterstützt. Funktionen verwenden eine „Wertrückgabe“-Aufrufkonvention. An Funktionen übergebene Werte werden beim Aufrufen der Funktion in Parameter kopiert und Ausgaben werden zurückkopiert. Dies wird durch die Qualifizierer in, out und inout bestimmt.