Язык шейдинга графики Android (AGSL) используется в Android 13 и более поздних версиях для определения поведения программируемых объектов RuntimeShader
. AGSL во многом разделяет свой синтаксис с фрагментными шейдерами GLSL, но работает в системе рендеринга графики 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
.
Язык шейдинга графики Android (AGSL) используется в Android 13 и более поздних версиях для определения поведения программируемых объектов RuntimeShader
. AGSL во многом разделяет свой синтаксис с фрагментными шейдерами GLSL, но работает в системе рендеринга графики 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
.