2012-12-13 36 views
0

我对寄存器有点困惑。Adboe AGAL关于寄存器的困惑

本文

http://www.adobe.com/devnet/flashplayer/articles/what-is-agal.html

那里有两个行AGAL代码

m44 op, va0, vc0 
mov v0, va1 

第一行把计算结果运算寄存器,而第二行没有经营 运算寄存器,

那么做第一行有什么意义?

还我发现了一个演示:

//compile vertex shader 
var vertexShader:Array = 
    [ 
    "dp4 op.x, va0, vc0", //4x4 matrix transform from 0 to output clipspace 
    "dp4 op.y, va0, vc1", 
    "dp4 op.z, va0, vc2", 
    "dp4 op.w, va0, vc3", 
    "mov v0, va1.xyzw" //copy texcoord from 1 to fragment program 
    ]; 
var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler(); 
vertexAssembler.assemble(flash.display3D.Context3DProgramType.VERTEX, vertexShader.join("\n")); 

//compile fragment shader 
var fragmentShader:Array = 
    [ 
    "mov ft0, v0\n", 
    "tex ft1, ft0, fs1 <2d,clamp,linear>\n", //sample texture 1  
    "mov oc, ft1\n" 
    ]; 
在vertexShader

,前三名行也把reslut的运算,但第四线ALOS不使用它。

那么这是什么意思?

感谢

回答

1

第一行简单地乘以当前顶点位置和模型 - 视图 - 投影矩阵和将结果写入输出寄存器。

第二行使用不同的寄存器将一些数据传递给像素着色器。由于这两行代码都是我可以看到的,我只能说va1可能包含纹理UV坐标。

+0

是的,所以第一行和第二行之间没有联系?我可以解释为最终GPU将操作op和oc寄存器中的数据吗?在第二个演示中,vertexShader前3行已经做了计算,并把结果运算,第四行是用来将数据放在V0,将在fragmentShader使用,然后在fragmentShader的所有数据将在OC存储。之后GPU可以开始操作op和oc中的数据?我正确吗?谢谢 – Tunied

+0

没有连接,两条线都做不同的事情。 两个像素和顶点着色器上执行以这样的顺序GPU: 顶点着色>顶点削波(由GPU内部完成的)>像素着色器。因此,GPU从第一个顶点着色器运行的角度开始运行。 – Varnius