Android 13 y versiones posteriores usan Android Graphics Shading Language (AGSL) para definir el comportamiento de los objetos RuntimeShader
programables. AGSL comparte gran parte de su sintaxis con sombreadores de fragmentos GLSL, pero funciona dentro del sistema de renderización de gráficos de Android para personalizar la pintura dentro de Canvas
y filtrar el contenido de View
.
Teoría de operación
Los efectos AGSL existen como parte de la canalización de gráficos de Android más grande. Cuando Android emite una operación de dibujo acelerada por GPU, ensambla un solo sombreador de fragmentos de la GPU para realizar el trabajo requerido. Por lo general, este sombreador incluye varios elementos. Por ejemplo, podría incluir:
- Evaluar si un píxel queda dentro o fuera de la forma que se está dibujando (o en el borde, donde podría aplicar suavizado de contorno).
- Evaluar si un píxel se encuentra dentro o fuera de la región de recorte (nuevamente, con una posible lógica de suavizado de contorno para píxeles de borde).
- Lógica para
Shader
enPaint
En realidad, el sombreador puede ser un árbol de objetos (debido aComposeShader
y otras funciones que se describen a continuación). - Lógica similar para
ColorFilter
. - Código de combinación (para ciertos tipos de
BlendMode
) - Código de conversión del espacio de color, como parte de la administración de color de Android
- Cuando
Paint
tiene un árbol complejo de objetos en los camposShader
,ColorFilter
oBlendMode
, solo hay un único sombreador de fragmentos de la GPU. Cada nodo del árbol crea una sola función. El código de recorte y el código de geometría crean una función cada uno. El código de combinación podría crear una función. Luego, el sombreador de fragmentos general llama a todas estas funciones (que pueden llamar a otras funciones, p.ej., en el caso de un árbol de sombreadores).
Tu efecto AGSL contribuye con una función (o funciones) al sombreador de fragmentos de la GPU.
Sintaxis básica
AGSL (y GLSL) son idiomas específicos del dominio de estilo C. Tipos como bool
y int
rastrean de cerca sus equivalentes de C; hay tipos adicionales para admitir vectores y matrices que admitan la funcionalidad del dominio.
Los calificadores se pueden aplicar a tipos para sugerencias de precisión de una manera exclusiva de los lenguajes de sombreado. Las estructuras de control, como las declaraciones if-else
, funcionan de la misma manera que en C. El lenguaje también proporciona compatibilidad con declaraciones switch
y bucles for
con limitaciones. Algunas estructuras de control requieren expresiones constantes que se pueden evaluar en el tiempo de compilación.
AGSL admite funciones; todos los programas de sombreadores comienzan con la función main
.
Se admiten funciones definidas por el usuario, sin la compatibilidad con recursividad de ningún tipo.
Las funciones usan una convención de llamada de “retorno de valor”. Los valores que se pasan a las funciones se copian en parámetros cuando se llama a estas y se copian los resultados. Esto se determina mediante los calificadores in
, out
y inout
.