Adobe推出的新语言AGAL属于molehill的一部分,下面开始结合网络收集的资源进行AGAL的了解与学习。
通过AGAL我们可以创建着色器来利用GPU运算,AGAL的语法大致如下:
"dp4 op.x, va0, vc0",
"dp4 op.y, va0, vc1",
"dp4 op.z, va0, vc2",
"dp4 op.w, va0, vc3",
"mov v0, va1.xyzw"
本人咋看也是一头雾水,感觉回到了大学时学汇编语言时。不过网络牛人多啊,我们就跟随前人一道成长吧。
它的语法为一句一行,包括:[操作码(固定长度3)、操作目标、元数据1、元数据2]
有时候元数据2可以是不需要注明的,在需要用到2个元数据的时候才需要定义2个,这好比替换和新增。
网络上说所有的操作码大致30个,都可以在molehill的文档中找到,但是由于女友在海绵宝宝中…我就不再去寻找了。暂时通过代码中的常用和网络上收集信息进行学习。毕竟一口也吃不成胖子。
下面是常用的操作码以及操作码的说明:
mov:将元数据1移动到目标
add:目标=元数据1+元数据2
sub:目标=元数据1-元数据2
mul:目标=元数据1*元数据2
div:目标=元数据1/元数据2
dp3:计算元数据1与元数据2 (应该是运算投影什么的,具体后面再看)
dp4:同理上
m44:元数据1与元数据2做乘法得到的4x4matrix
tex:读取纹理纹理坐标从元数据1和2
AGAL寄存器
从GPU中划分出小部分存储器用于我们的计算,在指令操作中,元数据与目标数据均储存于寄存器区域中。同样你可以通过寄存器给你的着色器传递参数。
每个寄存器占用128bit,他可以用来存4个flaot数据,32*4=128。
每一个浮点数据被称为寄存器的一个元
寄存器元可以是坐标数据,例如xyzw的值,也可以是颜色值,rgba,我们存取一个寄存器元可以通过下面的2种方式:
<寄存器名称>.x 例如最上面的"dp4 op.x, va0, vc0"中dp4 op.x便是在为op寄存器的x元做存操作
而操作一个寄存器中红色通道值的办法便是
<寄存器名>.r
那么我们就可以进一步推断出,add,sub等操作就是在2个寄存器元之间进行一一运算操作,并将结果存储到目标寄存器中。
属性寄存器
属性寄存器参与顶点着色器(着色器分顶点着色器与像素着色器)中的顶点数据(vertexBuffer),所以他们只能在顶点着色器中使用。
为了将一个VertexBUffer分派给指定的属性寄存器,我们使用方法Context3D:setVertexBufferAt(传入一个特有的下标)方法
通过着色器,我们通过下面的方法来访问属性。
Va<n> n=我们setvertexBufferAt所传入的下标。
我们一共可以同时利用8个属性寄存器在定点着色器中。
常数寄存器
常数寄存器有助于通过方法Context3D::setProgramConstants等方法,从as3中向着色器传递参数。
此类寄存器通过下面的样子进行操作:
Vc<n> 顶点着色器
Fc<n>像素着色器
同属性寄存器的道理,n代表注册时候带入的下标
我们一共可以使用128个顶点常数寄存器和28个像素常熟寄存器
临时寄存器
故名思想,临时寄存器用于临时的运算用,如方法变量。我们通过vt和ft来访问此类寄存器。顶点着色器与像素着色器分别可以使用8个此类寄存器。
输出寄存器
着色器利用输出寄存器来输出他们的计算结果,对于顶点着色器而言输出的为一个点坐标信息,对于像素着色器输出的为一个像素的颜色
通过op和oc的方式分别操作点和颜色
对于两种着色器,这里都只有对应的一个输出寄存器(这里是最好理解的,可以将2个流数据出口,而输出地在GPU寄存器中,而输出目的地就是我们的着色器,并进行显示)
演变寄存器
此类寄存器用来将数据从顶点着色器传递给像素着色器,数据在传递之前给GPU做了适当的处理,所以像素着色器才可以提通过此类寄存器得到符合它要求的数据。
典型的转换数据类型为一个点的颜色或纹理数据。
我们通过v<n>的方式进行访问,一共有8个变量寄存器
纹理寄存器
纹理寄存器用来从纹理中获取颜色值。
通过方法Context3D::setTextureAt()。
Ft<n> <flags> flags是一组指定如何构建模型的标志
Flags是被逗号隔开的一组字符串如下:
尺寸的:2d,3d,cube
投影:nomip,mipnone,mipenearest
滤镜:nearest,linear
拷贝:repeat,wrap,clamp
如下一个标准的2D模型,没有投影,拥有线性滤镜的可以存放如模型存储器ft1:
Tex ft1,v0,fs0<2d,linear,nomip>