使用AGAL寄存器
AGAL不像ActionScript和其它高级语言那样用变量来存储数据,而只使用寄存器。寄存器是GPU中的小块内存区域,供AGAL程序(着色器)运行时使用。寄存器用来存储AGAL运算过程中的数据及结果。你也可以通过寄存器向着色器传递参数。
每个寄存器为128位,这意味着其可以存放4个浮点数,每一个浮点数被称为寄存器的一个分量(component)。
这些寄存器中的分量既可以通过坐标访问器(xyzw)也可以通过颜色访问器(RGBA)进行访问。
寄存器中第一个分量,既可以通过坐标访问器访问:
- <register name>.x
也可以通过颜色访问器访问:
- <register name>.r
有些时候寄存器中存放的是坐标数据,有些时候存放颜色数据。通过使用正确的访问器,可以使你的代码清晰易读。
以上opcode中的有些指令比如:add,执行的是分量形式(component wise)的操作,意思是说,按分量相加,即:x分量加x分量,y分量加y分量等等。
在AGAL中有6种可用的寄存器。
1、属性寄存器
这些寄存器存放 VertextBuffer中定义的顶点属性数据,即顶点着色器的输入,因此,它们只能在顶点着色器中使用。
这是顶点着色器负责处理的主要的数据流,VertextBuffer中的每个顶点属性都有自己对应的属性寄存器。
用函数:Context3d:setVertexBufferAt(),将一个VertexBuffer属性以合适的索引,赋值给特定的属性寄存器。在着色器中可以通过语法:va<n>的形式来访问这个属性,<n>为寄存器的索引编号。
顶点着色器可用的属性寄存器一共有8个。
2、常量寄存器
这些寄存器的 作用为从ActionScript像着色器传递参数,由Context3D:setProgramConstants()等一系列函数执行。在顶点着色器 和片段着色器程序中,分别以vc<n>和fc<n>的形式访问这些寄存器,<n>同样为寄存器的索引编号。
顶点着色器中可用的常量寄存器为128个,片段着色器中为28个。
3、临时寄存器
这些寄存器在着色器中用来做临时计算。既然AGAL没有变量,所以你需要临时寄存器来保存计算过程中的中间数据。
临时寄存器以vt<n>(在顶点着色器中)和ft<n>(在片段着色器中)的语法形式访问,<n>代表寄存器编号。
顶点着色器和片段着色器各有8个临时寄存器可用。
4、输出寄存器
输出寄存器用来存放顶点和片段着色器的运算结果,即顶点着色器中顶点的坐标值和片段着色器中像素的颜色值。
在顶点着色器程序中通过语法:op的形式访问,在片段着色器中通过语法:oc的形式方式。
很显然,顶点和片段着色器各只有一个输出寄存器。
5、可变寄存器
这些寄存器用来从顶点着色器向片段着色器传递数据。传递过来的数据已经被GPU进行了适当的插值,以便片段着色器得到正确的像素数据。
这种数据的典型代表为顶点颜色或者纹理的UV坐标值。
这些寄存器可以通过v<n>的形式访问,<n>为寄存器编号。
共有8个可变寄存器。
6、纹理采样寄存器
纹理采样寄存器用来存放从纹理贴图中基于UV坐标采集的颜色值。
通过ActionScript调用Context3D::setTextureAt()函数来指定要使用纹理。
使用纹理采样寄存器的语法形式为:fs<n> <flags>,<n>代表采样寄存器编号,<flags>代表一些列指定如何进行采样的标识。<flags>是一个逗号分割的字符串,它由如下值可用:
- 纹理维度。包括:2d,cube.
- 多重材质映射,包括:nomip(或者mipnone,意思相同),mipnearest,miplinear。
- 纹理过滤,包括:nearest,linear。
- 重复纹理贴图,包括:repeat,wrap,clamp。
例如:一个标准的不带多重材质映射和渐变过滤的2D纹理,采样到临时寄存器ft1中,由如下代码表示:
- tex ft1, v0, fs0 <2d,linear,nomip>
上例中,可变寄存器v0中存放着经过插值的纹理UV坐标。