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.