AGAL 命令
名称 | opcode | 操作 | 说明 |
mov | 0×00 | 移动 | 将数据从 source1 移动到 destination |
add | 0×01 | 相加 | destination = source1 + source2 |
sub | 0×02 | 相减 | destination = source1 – source2 |
mul | 0×03 | 相乘 | destination = source1 * source2 |
div | 0×04 | 除以 | destination = source1 / source2 |
rcp | 0×05 | 倒数 | destination = 1/source1 |
min | 0×06 | 最小值 | destination = minimum(source1,source2) |
max | 0×07 | 最大值 | destination = maximum(source1,source2)
destination = maximum(source1,source2) |
frc | 0×08 | 分数 | destination = source1 – (float)floor(source1)
destination = source1 – (float)floor(source1) |
sqt | 0×09 | 平方根 | destination = sqrt(source1) |
rsq | 0x0a | 平方根倒数 | destination = 1/sqrt(source1) |
pow | 0x0b | 幂 | destination = pow(source1,source2) |
log | 0x0c | 对数 | destination = log_2(source1) |
exp | 0x0d | 指数 | destination = 2^source1 |
nrm | 0x0e | 标准化 | destination = normalize(source1) |
sin | 0x0f | 正弦 | destination = sin(source1) |
cos | 0×10 | 余弦 | destination = cos(source1) |
crs | 0×11 | 向量积 | destination.x = source1.y * source2.z – source1.z * source2.y
destination.y = source1.z * source2.x – source1.x * source2.z destination.z = source1.x * source2.y – source1.y * source2.x |
dp3 | 0×12 | 点积 | destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z |
dp4 | 0×13 | 点积 | destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z + source1.w*source2.w |
abs |
0×14 | 取绝对值 | destination = abs(source1),按组件 |
neg | 0×15 | 求反 | destination = -source1,按组件 |
sat | 0×16 | 饱和 | destination = maximum(minimum(source1,1),0),按组件 |
m33 | 0×17 | 矩阵连乘3×3 | destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z)
destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) |
m44 | 0×18 | 矩阵连乘4×4 | destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)
destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w) destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w) destination.w = (source1.x * source2[3].x) + (source1.y * source2[3].y) + (source1.z * source2[3].z) + (source1.w *source2[3].w) |
m34 | 0×19 | 矩阵连乘3×4 | destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)
destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w) destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w) |
kil | 0×27 | 丢弃 | 如果单个标量源组件小于零,则将丢弃片段并不会将其绘制到帧缓冲区。 (目标寄存器必须全部设置为 0) |
tex | 0×28 | 纹理取样 | destination 等于从坐标 source1 上的纹理 source2 进行加载。在这种情况下, source2 必须采用取样器格式 |
sge | 0×29 | 大于等于时设置 | destination = source1 >= source2 ? 1 : 0 |
slt | 0x2a | 小于时设置 | destination = source1 < source2 ? 1 : 0 |
seq | 0x2c | 相等时设置 | destination = source1 == source2 ? 1 : 0 |
sne | 0x2d | 不相等时设置 |
destination = source1 != source2 ? 1 : 0 |
va 属性寄存器
很多人看到这个名字的时候都会认为va中应该存的是某一个对象的属性,或者一些其他什么东西。但实事并非如此。当你上载一些顶点数据之后,我们通过AS3来制定这些顶点所存在的位置,那么你就可以通过va来直接使用。举个简单的例子,在上一篇文章中,我们使用了va0,而va0的数据又是从etVertexBufferAt来直接指定的,所以在你编写代码的时候,你的AGAL和AS3有着直接的联系。
vc 常量寄存器
顾名思义,与程序中的常量概念类似,这部分数据是从外部直接传递进来的,至于你如何使用完全取决于你自己。关于用法我们在后面会涉及到。
vt 临时寄存器
应该说vt的概念最接近于我们程序中的变量,因为他可以被你临时读取,并且允许你在AGAL运行时来动态改变其中的数值。
op 输出寄存器
好吧,当你吧所有的操作都完成后,那么你的结果应该有一个归宿,这个op就是你顶点数据最后的归宿。每次运行顶点数据后,你都应该看到op,否则你的程序运行后没有任何效果。
----------------------------------------------------------HOHO--------------------------------------------------------------
fs 纹理采样寄存器
教程到目前位置,我们还没有看到任何和贴图有关系的内容。不错,笔者打算将这部分内容放在后面讲解。因为还有不少好东西放在后面等着大家呢。这里简单解释一下,所谓纹理采样,则是调用你显存中的纹理数据。纹理我们可以理解为贴图,或者理解为你上载到GPU的那张图片。
fc 常量寄存器
又遇到常量了。这里和刚才的vc其实是一样的,因为顶点和纹理这两部分的程序不可交叉访问,所以贴图也有自己的常量寄存器。
ft 临时寄存器
和vt概念相同,但只用于纹理操作。
oc 输出寄存器
和op相同,但只能用于纹理操作。
----------------------------------------------------------HOHO--------------------------------------------------------------
v 插值寄存器
这是比较特殊的一个寄存器,因为刚才我们所说的8个寄存器类型只能在自己负责的领域操作,顶点的寄存器不可访问纹理的内容,同样,纹理操作中也无法访问顶点数据,那么如果他们的数据有交集如何呢?这里就体现了v的作用(当然,在微博中,v也是一种身份的象征)。v可以在在顶点操作中使用,也可以在纹理操作中使用。
转:http://ashan.org/post-309.html#comment-17360