AGAL

    技术2022-05-13  11

    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:读取纹理纹理坐标从元数据12

    AGAL寄存器

    GPU中划分出小部分存储器用于我们的计算,在指令操作中,元数据与目标数据均储存于寄存器区域中。同样你可以通过寄存器给你的着色器传递参数。

    每个寄存器占用128bit,他可以用来存4flaot数据,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个像素常熟寄存器

    临时寄存器

    故名思想,临时寄存器用于临时的运算用,如方法变量。我们通过vtft来访问此类寄存器。顶点着色器与像素着色器分别可以使用8个此类寄存器。

    输出寄存器

    着色器利用输出寄存器来输出他们的计算结果,对于顶点着色器而言输出的为一个点坐标信息,对于像素着色器输出的为一个像素的颜色

    通过opoc的方式分别操作点和颜色

    对于两种着色器,这里都只有对应的一个输出寄存器(这里是最好理解的,可以将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>


    最新回复(0)