Android Graphics Shading Language (AGSL)

Android Graphics Shading Language (AGSL) используется в Android 13 и более поздних версиях для определения поведения программируемых объектов RuntimeShader. Синтаксис AGSL во многом совпадает с синтаксисом фрагментных шейдеров GLSL, но AGSL работает в системе рендеринга графики Android, позволяя настраивать рисование в Canvas и фильтровать контент View.

Принцип работы

Эффекты AGSL – это часть более крупного конвейера графики Android. Когда Android выполняет операцию рисования с ускорением графического процессора, он собирает один фрагментный шейдер графического процессора для выполнения требуемой работы. Обычно этот шейдер состоит из нескольких частей. Например, в него могут входить:

  • Оценка того, попадает ли пиксель внутрь или за пределы рисуемой фигуры (или на границу, где может применяться сглаживание).
  • Оценка того, находится ли пиксель внутри или за пределами области отсечения (опять же, с возможной логикой сглаживания для граничных пикселей).
  • Логика для Shader на Paint. Шейдер может быть деревом объектов (из-за ComposeShader и других функций, описанных ниже).
  • Аналогичная логика применяется к ColorFilter.
  • Код смешивания (для некоторых типов BlendMode).
  • Код преобразования цветового пространства, который используется в системе управления цветом Android.
  • Если Paint имеет сложное дерево объектов в полях Shader, ColorFilter или BlendMode, то по-прежнему используется только один фрагментный шейдер графического процессора. Каждый узел в этом дереве создает одну функцию. Код обрезки и код геометрии создают по одной функции. Код смешивания может создать функцию. Затем общий фрагментный шейдер вызывает все эти функции (которые могут вызывать другие функции, например в случае дерева шейдеров).

Эффект AGSL добавляет одну или несколько функций во фрагментный шейдер графического процессора.

Базовый синтаксис

AGSL (и GLSL) – это предметно-ориентированные языки в стиле C. Типы, такие как bool и int, тесно связаны со своими эквивалентами в C. Существуют дополнительные типы для поддержки векторов и матриц, которые поддерживают функциональность домена.

К типам можно применять квалификаторы, чтобы указывать точность. Это уникальная особенность языков шейдеров. Управляющие конструкции, такие как операторы if-else, работают так же, как и в C. Язык также поддерживает операторы switch и циклы for с ограничениями. Для некоторых управляющих структур требуются константные выражения, которые можно вычислить во время компиляции.

AGSL поддерживает функции. Каждая программа шейдера начинается с функции main. Пользовательские функции поддерживаются, но без рекурсии. Функции используют соглашение о вызове с возвратом значения. Значения, передаваемые функциям, копируются в параметры при вызове функции, а выходные данные копируются обратно. Это определяется квалификаторами in, out и inout.