Molehill的操作码和寄存器

来源:互联网 发布:java main执行 编辑:程序博客网 时间:2024/06/06 08:38

Molehill的寄存器:

AGAL语法:

<操作码><目标寄存器>,<源寄存器1>,<源寄存器2>\n

Molehill的寄存器:

Molehill共有六组寄存器

1属性寄存器组
同顶点缓冲相关。只在顶点着色器中可用。
通过Context3D:setVertexBufferAt()方法设定顶点缓冲所使用的寄存器编号。
通过va<n>来访问第n个寄存器单元。共有8个属性寄存器,即n最大值为7.

2常数寄存器组
用来传递参数。通过Context3D::setProgramConstants()方法组将AS中的数据存储到寄存器中。
在顶点着色器中用vc<n>来访问,在像素(片段)着色器中用fc<n>来访问。
在顶点着色器中共用128个寄存器单元可用,而在像素着色器中共有28个。(为啥不一样?)
Ps:在顶点着色器中,如果要传递的是矩阵参数,那么由于每个矩阵有16个元素所以要用到4个寄存器单元。这跟常数为矢量的时候不一样。

3临时寄存器组
在两种着色器中都可用,做临时计算用,存放临时的计算结果。
在顶点着色器中用vt<n>来访问,在像素着色器中用ft<n>来访问。
在两种着色器中都有8个单元可用。

4输出寄存器
用来存放顶点着色器或者像素着色器的计算结果。
在顶点着色器中用op来访问,在像素着色器中用oc来访问。
只有一个这样的寄存器单元。

5转化寄存器组
用来将顶点着色器中的数据传递到像素着色器中时,做中间的转化。这些数据在传递的过程中被GPU做适当的插值替换(interpolated),从而使像素着色器能够得到正确的值。
典型的这种转化是顶点颜色或者纹理的uv坐标。
在两种着色器中都用v<n>来访问某一个寄存器单元,共有8个这样的单元。

6纹理寄存器组(纹理采样器组)
用来在纹理上提取颜色值,同时颜色的提取还依赖于uv坐标。
用Context3D::setTextureAt()方法来设定纹理数据及其所属的寄存器编号.
访问纹理寄存器的方法fs<n><flags>。
n为寄存器编号,flags为参数组,用逗号分隔,具体有如下几个可选值:
纹理维度: 2d 3d cube
Mip映射:nomip, mipnone, mipnearest, mipnone
纹理滤镜:nearest, linear
纹理重复:: repeat, wrap, clamp
共有8个纹理寄存器单元。
Ps:
每个寄存器单元有128位的存储空间,可以存放4个(32位)的浮点数。每个浮点数都被称为这个寄存器单元的分量(component)。
可以通过xyzw或者rgba来访问每个寄存器单元的分量。Eg. <register name>.x

部分操作码:
m44 : 操作一个四维矩阵(源寄存器2)和一个四维矢量(源寄存器1)相乘。
dp3,dp4 :操作两个3,4维矢量的点积
tex: 加载材质; <源寄存器2>是材质被存储的位置,<源寄存器1>是uvt坐标。
Ps:需要注意的是对于大部分操作码源操作数(源寄存器)是不可交换的。
特别地,add sub mul div这四个操作的操作数位置都可以认为同数学运算中的操作数的位置相同。Eg.:sub a , b ,c 代表数学运算 a=b-c。