Android 图形着色语言 (AGSL)

Android 图形着色语言 (AGSL) 由 Android 13 及更高版本用于定义可编程 RuntimeShader 对象的行为。AGSL 的语法与 GLSL 片段着色器有很多共同之处,但在 Android 图形渲染系统内部工作,既可自定义 Canvas 内的绘制,也可过滤 View 内容。

运作原理

AGSL 效果作为更大的 Android 图形流水线的一部分存在。当 Android 发出 GPU 加速的绘制操作时,它会汇集一个单独的 GPU 片段着色器来执行所需的工作。这个着色器通常包含几个部分。例如,它可能包含

  • 评估像素是位于要绘制形状的内部还是外部(或边界上,边界上可能会应用抗锯齿)。
  • 评估像素是位于裁剪区域的内部还是外部(同样,对于边界像素可能包含抗锯齿逻辑)。
  • Paint 上的 Shader 的逻辑。Shader 实际上可以是一个对象树(由于 ComposeShader 和下述其他功能)。
  • ColorFilter 的类似逻辑。
  • 混合代码(用于特定类型的 BlendMode)。
  • 颜色空间转换代码,作为 Android 颜色管理的一部分。
  • PaintShaderColorFilterBlendMode 字段中包含复杂对象树时,仍然只有一个 GPU 片段着色器。该树中的每个节点创建一个函数。裁剪代码和几何代码都创建一个函数。混合代码可能创建一个函数。整体片段着色器然后调用所有这些函数(这些函数又可能调用其他函数,例如在着色器树的情况下)。

你的 AGSL 效果为 GPU 的片段着色器贡献一个(或多个)函数。

基本语法

AGSL(和 GLSL)是 C 风格的领域特定语言。类型如 boolint 与其 C 语言对应项密切相关;还有额外的类型用于支持向量和矩阵,这些类型支持领域功能。

限定符可以应用于类型以提供精度提示,这是着色语言所独有的。控制结构如 if-else 语句的用法与在 C 语言中非常相似;该语言还支持 switch 语句和有局限性的 for 循环。某些控制结构需要可在编译时求值的常量表达式。

AGSL 支持函数;每个着色器程序都从 main 函数开始。支持用户定义函数,但不允许任何形式的递归。函数使用“值返回”的调用约定;传递给函数的值在函数调用时复制到参数中,输出则复制回来;这由 inoutinout 限定符决定。