AGSL 在设计上与 GLSL ES 1.0 基本兼容。如需更多信息 请参阅 OpenGL ES 着色语言文档。 如果可能,本文档会重点介绍 AGSL 和 和 GLSL。
类型
AGSL 支持 GLSL ES 1.0 类型,同时还支持表示向量的其他方式
和矩阵类型。AGSL 支持使用额外的 short
和 half
类型来表示
中等精度。
基本类型
类型 | 说明 |
---|---|
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
适用于 setColorUniform 、setFloatUniform 、
setIntUniform 、setInputBuffer 和
setInputShader 。 |
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
(通用类型)为 float
、float2
、float3
、float4
或
half
、half2
、half3
、half4
。
其中大多数函数都是在组件级运行的(将函数应用于 )。如果情况并非如此,则会注明。
角度和三角函数
假设以角度指定的函数参数采用弧度单位。 在任何情况下,这些函数都不会导致除以零错误。如果 比率的除数为 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。 这样可以避免颜色空间转换和过滤。