Linguagem de sombreamento gráfico do Android (AGSL)

A Linguagem de sombreamento gráfico do Android (AGSL) é usada pelo Android 13 e versões mais recentes para definir o comportamento de objetos RuntimeShader programáveis. A AGSL compartilha grande parte da sintaxe com sombreadores de fragmento da GLSL, mas funciona no sistema de renderização de gráficos do Android para personalizar a pintura em Canvas e filtrar o conteúdo de View.

Teoria da operação

Os efeitos da AGSL existem como parte do pipeline maior de gráficos do Android. Quando o Android emite uma operação de desenho acelerado por GPU, ele monta um único sombreador de fragmento da GPU para fazer o trabalho necessário. Normalmente, esse sombreador inclui várias partes. Por exemplo, isso pode incluir:

  • Avaliar se um pixel está dentro ou fora da forma que está sendo desenhada (ou na borda, onde ele pode aplicar a suavização).
  • Avaliar se um pixel está dentro ou fora da região de recorte (novamente, com uma possível lógica de anti-aliasing para pixels de borda).
  • Lógica para Shader na Paint. O Shader pode ser, na verdade, uma árvore de objetos (devido ao ComposeShader e a outros recursos descritos abaixo).
  • Lógica semelhante para ColorFilter.
  • Código de combinação (para determinados tipos de BlendMode).
  • Código de conversão do espaço de cores, como parte do gerenciamento de cores do Android.
  • Quando o Paint tem uma árvore complexa de objetos nos campos Shader, ColorFilter ou BlendMode, ainda há apenas um sombreador de fragmentos de GPU. Cada nó dessa árvore cria uma única função. Os códigos de recorte e geometria criam uma função. O código de combinação pode criar uma função. O sombreador de fragmento geral chama todas essas funções, que podem chamar outras funções, como no caso de uma árvore de sombreador.

O efeito da AGSL contribui com uma função (ou funções) para o sombreador de fragmentos da GPU.

Sintaxe básica

AGSL (e GLSL) são linguagens específicas de domínio no estilo C. Tipos como bool e int rastreiam de perto os equivalentes em C. Há outros tipos para oferecer suporte a vetores e matrizes com suporte à funcionalidade de domínio.

Os qualificadores podem ser aplicados a tipos de dicas de precisão de uma maneira exclusiva para linguagens de sombreamento. As estruturas de controle, como instruções if-else, funcionam de maneira muito parecida com o que ocorre em C. A linguagem também oferece suporte a instruções switch e loops for com limitações. Algumas estruturas de controle exigem expressões constantes que podem ser avaliadas durante a compilação.

A AGSL oferece suporte a funções. Todos os programas de sombreador começam com a função main. As funções definidas pelo usuário são aceitas, sem suporte para recursão de qualquer tipo. As funções usam uma convenção de chamada de "valor-retorno". Os valores transmitidos para as funções são copiados em parâmetros quando a função é chamada, e as saídas são copiadas de volta. Isso é determinado pelos qualificadores in, out e inout.