Android 图形着色语言 (AGSL)

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

工作原理

AGSL 效果作为更大的 Android 图形管线的一部分存在。当 Android 发出 GPU 加速绘图操作时,它会组装单个 GPU 片段着色器来完成所需的工作。此着色器通常包含多个部分。例如,它可能包括

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

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

基本语法

AGSL(和 GLSL)是 C 风格的特定领域语言。诸如 boolint 之类的类型与其 C 等效项密切相关;还有其他类型来支持支持域功能的向量和矩阵。

限定符可以以着色语言特有的方式应用于类型以进行精度提示。诸如 if-else 语句之类的控制结构的工作方式与在 C 中非常相似;该语言还提供对 switch 语句和 for 循环的支持,但有限制。某些控制结构需要可以在编译时计算的常量表达式。

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