Android 图形着色语言 (AGSL) 由 Android 13 及更高版本使用,用于定义可编程 RuntimeShader
对象的行为。AGSL 的语法与 GLSL 片段着色器有很多相似之处,但在 Android 图形渲染系统中工作,既可以自定义 Canvas
中的绘制,也可以过滤 View
内容。
工作原理
AGSL 效果作为更大的 Android 图形管线的一部分存在。当 Android 发出 GPU 加速绘图操作时,它会组装单个 GPU 片段着色器来完成所需的工作。此着色器通常包含多个部分。例如,它可能包括
- 评估像素是否落在正在绘制的形状内或形状外(或在边界上,它可能会应用抗锯齿)。
- 评估像素是否落在裁剪区域内或区域外(同样,对于边界像素,可能包含抗锯齿逻辑)。
Paint
上的Shader
的逻辑。着色器实际上可以是对象的树(由于ComposeShader
和下面描述的其他功能)。- 类似的
ColorFilter
逻辑。 - 混合代码(对于某些类型的
BlendMode
)。 - 颜色空间转换代码,作为 Android 颜色管理的一部分。
- 当
Paint
在Shader
、ColorFilter
或BlendMode
字段中具有复杂的对象树时,仍然只有一个 GPU 片段着色器。该树中的每个节点都会创建一个函数。裁剪代码和几何代码都会创建一个函数。混合代码可能会创建一个函数。然后,整体片段着色器会调用所有这些函数(这些函数可能会调用其他函数,例如在着色器树的情况下)。
您的 AGSL 效果会为 GPU 的片段着色器贡献一个函数(或多个函数)。
基本语法
AGSL(和 GLSL)是 C 风格的特定领域语言。诸如 bool
和 int
之类的类型与其 C 等效项密切相关;还有其他类型来支持支持域功能的向量和矩阵。
限定符可以以着色语言特有的方式应用于类型以进行精度提示。诸如 if-else
语句之类的控制结构的工作方式与在 C 中非常相似;该语言还提供对 switch
语句和 for
循环的支持,但有限制。某些控制结构需要可以在编译时计算的常量表达式。
AGSL 支持函数;每个着色器程序都以 main
函数开头。支持用户定义的函数,但不支持任何形式的递归。函数使用“值返回”调用约定;调用函数时,传递给函数的值会被复制到参数中,输出会被复制回来;这由 in
、out
和 inout
限定符确定。