AGAL寄存器

使用AGAL寄存器

AGAL不像ActionScript和其它高级语言那样用变量来存储数据,而只使用寄存器。寄存器是GPU中的小块内存区域,供AGAL程序(着色器)运行时使用。寄存器用来存储AGAL运算过程中的数据及结果。你也可以通过寄存器向着色器传递参数。

 

每个寄存器为128位,这意味着其可以存放4个浮点数,每一个浮点数被称为寄存器的一个分量(component)。

 

这些寄存器中的分量既可以通过坐标访问器(xyzw)也可以通过颜色访问器(RGBA)进行访问。

 

寄存器中第一个分量,既可以通过坐标访问器访问:

  1. <register name>.x

 

也可以通过颜色访问器访问:

  1. <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>是一个逗号分割的字符串,它由如下值可用:

  1. 纹理维度。包括:2d,cube.
  2. 多重材质映射,包括:nomip(或者mipnone,意思相同),mipnearest,miplinear。
  3. 纹理过滤,包括:nearest,linear。
  4. 重复纹理贴图,包括:repeat,wrap,clamp。

例如:一个标准的不带多重材质映射和渐变过滤的2D纹理,采样到临时寄存器ft1中,由如下代码表示:

  1. tex ft1, v0, fs0 <2d,linear,nomip>

 

上例中,可变寄存器v0中存放着经过插值的纹理UV坐标。

转载于:https://www.cnblogs.com/lvwj/archive/2012/11/07/2758882.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值