AGSL 快速参考

AGSL 在设计上与 GLSL ES 1.0 基本兼容。如需更多信息 请参阅 OpenGL ES 着色语言文档。 如果可能,本文档会重点介绍 AGSL 和 和 GLSL。

类型

AGSL 支持 GLSL ES 1.0 类型,同时还支持表示向量的其他方式 和矩阵类型。AGSL 支持使用额外的 shorthalf 类型来表示 中等精度。

基本类型

类型 说明
void 没有函数返回值或参数为空 列表。与 GLSL 中不同,没有 void 的函数 返回值类型必须返回一个值。
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4)
布尔值标量/矢量
int, ivec2, ivec3, ivec4
(int2, int3, int4)
highp 有符号整数/矢量
float, vec2, vec3, vec4
(float2, float3, float4)
highp(单精度)浮点 标量/矢量
short, short2, short3, short4 相当于 mediump int 的已签名 整数/矢量
half, half2, half3, half4 相当于 mediump float 标量/向量
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
2x2、3x3、4x4 float 矩阵
half2x2, half3x3, half4x4 相当于 mediump float 矩阵类型

精确率和范围最小值

这些是与每项数据相关的 最低精度和范围 修饰符。由于大多数设备 支持 ES 3.0,它们将具有更有保证的 highp 精度/范围,并且 范围:int mediump。精度修饰符可应用于标量、矢量和 矩阵变量和参数。我们只能保证达到下面列出的最低价格; lowp 的精度实际上不一定低于 mediump,而 mediump 精度不一定低于 highp。AGSL 目前会将lowp转换为 添加到最终输出中的 mediump

修饰符 “浮点数”续航里程 “浮点数”震级范围 “浮点数”精确度 '整数'续航里程
高点 \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) 相对: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
中等 \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) 相对: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
下普 \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) 绝对: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

除了数组数字下标语法之外,例如:var[num], names of vector components for vectors of length 2 - 4 are denoted by a single letter. Components can be swizzled and replicated. ex:vect.yx,vect.yy`

vect.xyzw - 用于访问表示点/法线的矢量

vect.rgba - 用于访问表示颜色的矢量

vect.LTRB - 当矢量表示矩形(不在 GLSL 中)时使用

在 AGSL 中,0 和 1 可用于在该通道中生成常数 0 或 1。 例如:vect.rgb1 == vec4(vect.rgb,1)

结构和数组

结构使用与 GLSL 相同的语法进行声明,但 AGSL 仅支持 全局范围内的结构。

struct type-name {
 members
} struct-name; // optional variable declaration.

仅支持明确数组大小的一维数组,使用 C 样式或 GLSL 样式语法:

<base type>[<数组大小>] 变量名称 - 例如:half[10] x;

<基本类型>变量名称 [<数组大小>] - 例如:half x[10];

不能从函数返回数组,也无法复制、赋值或比较数组。 数组限制会传播到包含数组的结构。数组可以 只能使用常量或循环变量编入索引。

资格赛

类型 说明
const 编译时常量或只读函数 参数。
uniform 值在基元中不会更改 处理中。 制服从 Android 传递至 RuntimeShader 适用于 setColorUniformsetFloatUniformsetIntUniformsetInputBuffersetInputShader
in 适用于传入的函数参数。这是默认值。
out 适用于传入的函数参数。必须使用 其精度与函数定义相同。
inout 对于既传入又传出的参数 一个函数。使用的精度必须与 函数定义。

变量声明

声明必须位于显式大括号内。在 v3 API 中,y 的声明 不允许使用以下示例:

if (condition)
    int y = 0;

矩阵/结构/数组基础知识

矩阵构造函数示例

使用单个值构造矩阵时,所有值以及 对角线赋予该值,其余取零。float2x2(1.0) 会 因此请创建一个 2x2 单位矩阵。

使用多个值构造矩阵时,先填充列 (主列顺序)。

请注意,与 GLSL 不同,此类构造函数会减少 不支持传入矢量,但您可以使用调配 效果。如需通过 AGSL 中的 vec4 构造 vec3,其行为与 GLSL,指定 vec3 nv = quadVec.xyz

结构构造函数示例

struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));

矩阵分量

使用数组下标语法访问矩阵的组成部分。

float4x4 m; // represents a matrix
m[1] = float4(2.0); // sets second column to all 2.0
m[0][0] = 1.0; // sets upper left element to 1.0
m[2][3] = 2.0; // sets 4th element of 3rd column to 2.0

结构字段

使用句点 . 运算符选择结构字段。运算符包括:

运营商 说明
. 字段选择器
==, != 等式
= 分配关系

数组元素

数组元素可使用数组下标运算符 [ ] 进行访问。例如:

diffuseColor += lightIntensity[3] * NdotL;

运算符

按优先级顺序编号。关系型和等式 运算符 ><<= >= == != 计算为布尔值。比较矢量 在组件一级使用 lessThan()equal() 等函数。

运营商 说明 关联性
1 () 括号分组 不适用
2 次 [] () . ++ -- 数组下标 函数调用和 构造函数结构 字段或方法 选择器, selector, swizzle 后缀递增和 减少 从左至右
3 ++ -- + - ! 前缀递增和 递减一元 从右到左
4 * / 乘除 从左至右
5 + - 加减法 从左至右
7 < > <= >= 关系型 从左至右
8 == != 等式/不等式 从左至右
12 && 逻辑 AND 从左至右
13 ^^ 逻辑 XOR 从左至右
14 || 逻辑 OR 从左至右
15 ?\: 选择(整个 操作数) 从左至右
16 = += -= *= /= 赋值算术 赋值算术 分配关系 从左至右
17 , 序列 从左至右

矩阵和矢量运算

应用于标量值时,算术运算符会生成一个标量。对于 除模数以外的运算符,如果一个操作数是标量,而另一个操作数是 矢量或矩阵,则运算按组件进行,并得出 相同的向量或矩阵类型。如果两个运算是大小相同的向量, 操作按组成部分执行(并返回相同的矢量类型)。

操作 说明
m = f * m 分量矩阵乘标量值
v = f * v 分量向量乘标量值
v = v * v 分量向量乘向量值
m = m + m 矩阵分量加法
m = m - m 矩阵分量减法
m = m * m 线性代数乘法

如果一个运算数是与矩阵的行或列大小匹配的向量,则 可使用乘法运算符执行代数的行和列乘法。

操作 说明
m = v * m 行向量 * 矩阵线性代数乘法
m = m * v 矩阵 * 列矢量线性代数乘法

对矢量点积、叉积和 分量乘法:

功能 说明
f = dot(v, v) 矢量点积
v = cross(v, v) 矢量叉积
m = matrixCompMult(m, m) 分量乘法

计划控制

函数调用 按价值-返回值调用
迭代 for (<init>;<test>;<next>)
{ break, continue }
选择 if ( ) { }
if ( ) { } else { }
switch () { break, case } - 默认大小写形式
跳跃 break, continue, return
(不允许舍弃)
条目 half4 main(float2 fragCoord)

对于循环限制

与 GLSL ES 1.0 类似,“for”循环都非常有限;编译器必须能够 来展开循环。这意味着初始化程序、测试条件和 next 语句必须使用常量,以便在编译时计算所有内容 。next 语句还限制为使用 ++, --, +=, or -=

内建函数

GT(通用类型)为 floatfloat2float3float4halfhalf2half3half4

其中大多数函数都是在组件级运行的(将函数应用于 )。如果情况并非如此,则会注明。

角度和三角函数

假设以角度指定的函数参数采用弧度单位。 在任何情况下,这些函数都不会导致除以零错误。如果 比率的除数为 0,则结果将未定义。

功能 说明
GT radians(GT degrees) 将角度转换为弧度
GT degrees(GT radians) 将弧度转换为角度
GT sin(GT angle) 标准正弦
GT cos(GT angle) 标准余弦
GT tan(GT angle) 标准正切
GT asin(GT x) 返回正弦为范围中的 x 的角 / $ \left[-{\pi\over 2},{\pi\over 2}\right] $
GT acos(GT x) 返回余弦为 x 在 $ \left[0,\pi\right] $ 的范围
GT atan(GT y, GT x) 返回一个角度,其角度与 三角反正切 $ \left[{y\over x}\right] $ 在 $ \left[-\pi,\pi\right] $ 的范围
GT atan(GT y_over_x) 返回三角函数所对应的角 反正切值是范围内的 y_over_x / $ \left[-{\pi\over 2},{\pi\over 2}\right] $

指数函数

功能 说明
GT pow(GT x, GT y) 返回 $ x^y $
GT exp(GT x) 返回 $ e^x $
GT log(GT x) 返回 $ ln(x) $
GT exp2(GT x) 返回 $ 2^x $
GT log2(GT x) 返回 $ log_2(x) $
GT sqrt(GT x) 返回 $ \sqrt{x} $
GT inversesqrt(GT x) 返回 $ 1\over{\sqrt{x}} $

常用函数

功能 说明
GT abs(GT x) 绝对值
GT sign(GT x) 基于 x 的符号返回 -1.0、0.0 或 1.0
GT floor(GT x) 最接近的整数 <= x
GT ceil(GT x) 最接近的整数 >= x
GT fract(GT x) 返回 x 的小数部分
GT mod(GT x, GT y) 返回 x 模 y 的值
GT mod(GT x, float y) 返回 x 模 y 的值
GT min(GT x, GT y) 返回 x 或 y 的最小值
GT min(GT x, float y) 返回 x 或 y 的最小值
GT max(GT x, GT y) 返回 x 或 y 的最大值
GT max(GT x, float y) 返回 x 或 y 的最大值
GT clamp(GT x, GT minVal, GT maxVal) 返回限制在 minVal 和 maxVal 之间的 x。
GT clamp(GT x, float minVal, float maxVal) 返回限制在 minVal 和 maxVal 之间的 x
GT saturate(GT x) 返回限制在 0.0 到 1.0 之间的 x
GT mix(GT x, GT y GT a) 返回 x 和 y 的线性混合
GT mix(GT x, GT y, float a) 返回 x 和 y 的线性混合
GT step(GT edge, GT x) 如果 x <,则返回 0.0边缘,否则为 1.0
GT step(float edge, GT x) 如果 x <,则返回 0.0边缘,否则为 1.0
GT smoothstep(GT edge0, GT edge1, GT x) 执行隐士插值 介于 0 和 1 之间(如果 Edge0 <x <边缘 1
GT smoothstep(float edge0, float edge1, GT x) 执行隐士插值 介于 0 和 1 之间(如果 Edge0 <x <边缘 1

几何函数

这些函数以矢量(而非分量)的形式对矢量执行操作。GT 是尺寸为 2-4 的浮点/半矢量。

功能 说明
float/half length (GT x) 返回矢量的长度
float/half distance(GT p0, GT p1) 返回点与点之间的距离
float/half dot(GT x, GT y) 返回点积
float3/half3 cross(float3/half3 x, float3/half3 y) 返回交叉乘积
GT normalize(GT x) 将矢量归一化为长度 1
GT faceforward(GT N, GT I, GT Nref) 如果 dot(Nref, I) <0,否则为 -N。
GT reflect(GT I, GT N) 反射方向 I - 2 * dot(N,I) * N。
GT refract(GT I, GT N, float/half eta) 返回折射矢量

矩阵函数

mat 类型是任何方阵类型。

功能 说明
mat matrixCompMult(mat x, mat y) 将 x 乘以 y 分量
mat inverse(mat m) 返回 m 的逆

矢量关系函数

按分量比较 x 和 y。特定调用的输入矢量和返回矢量的大小必须匹配。T 是整数和浮点矢量类型的并集。BV 是一个与输入矢量大小匹配的布尔矢量。

功能 说明
BV lessThan(T x, T y) x <年
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) X >年
BV greaterThanEqual(T x, T y) x >= y
BV equal(T x, T y) x == y
BV equal(BV x, BV y) x == y
BV notEqual(T x, T y) x != y
BV notEqual(BV x, BV y) x != y
bool any(BV x) 如果 x 的任何组成部分为 true,则为 true
bool all(BV x) 如果 x 的所有组成部分均为 true,则返回 true
BV not(BV x) x 的逻辑补码

颜色函数

功能 说明
vec4 unpremul(vec4 color) 将颜色值转换为非预乘值 Alpha 版
half3 toLinearSrgb(half3 color) 颜色空间转换为线性 SRGB
half3 fromLinearSrgb(half3 color) 颜色空间转换

着色器采样(评估)

采样器类型不受支持,但您可以评估其他着色器。如果您需要 你可以创建一个 BitmapShader 对象,并将其添加为 uniform。您可以针对任何着色器执行此操作,这意味着您可以直接评估 而无需将其转换为 Bitmap,包括 RuntimeShader 对象。这样, 但复杂的着色器的开销可能会很大 尤其是在循环中。

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

原始缓冲区采样

虽然大多数图片都包含应进行颜色管理的颜色,但有些图片 包含并非实际颜色的数据,如存储法线的图片、 材料属性(例如粗糙度)、高度图或其他任何 恰好存储在图像中的数学数据。使用这些类型时 你可以将 BitmapShader 用作通用原始缓冲区(使用 RuntimeShader#setInputBuffer。 这样可以避免颜色空间转换和过滤。