Android 图形着色语言 (AGSL) 由 Android 13 及更高版本使用,用于定义可编程 RuntimeShader
对象的行为。AGSL 的语法与 GLSL 片段着色器有很多相同之处,但在 Android 图形渲染系统中工作,既可以定制 Canvas
中的绘制,也可以过滤 View
内容。
工作原理
AGSL 效果作为 Android 图形管道的更大一部分存在。当 Android 发出 GPU 加速的绘制操作时,它会组装一个单一的 GPU 片段着色器来完成所需的工作。这个着色器通常包括几个部分。例如,它可能包括
- 评估像素是否位于绘制的形状内或外部(或在边界上,它可能应用抗锯齿)。
- 评估像素是否位于裁剪区域内或外部(同样,对于边界像素可能具有抗锯齿逻辑)。
- 针对
Shader
在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
限定符确定的。