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
imPaint
. Der Shader kann aufgrund vonComposeShader
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 FeldernShader
,ColorFilter
oderBlendMode
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.