【问题标题】:Adboe AGAL confused about the registersAdobe AGAL 对寄存器感到困惑
【发布时间】:2012-12-13 07:10:43
【问题描述】:

我对寄存器有点困惑。

在这篇文章中,http://www.adobe.com/devnet/flashplayer/articles/what-is-agal.html

有两行 AGAL 代码

m44 op, va0, vc0
mov v0, va1

第一行将计算结果放入op寄存器,第二行没有操作 操作寄存器,

那么做第一行是什么意思?

我还找到了一个演示:

//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放在op中,但第四行也没有使用。

那是什么意思?

谢谢

【问题讨论】:

    标签: actionscript-3 flash stage3d agal


    【解决方案1】:

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

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

    【讨论】:

    • 是的,所以第一行和第二行之间没有联系?我可以解释为最终 GPU 将操作 op 和 oc 寄存器中的数据吗?在第二个demo中,vertexShader的top 3行已经完成了计算,并将结果放入op中,第四行用于将数据放入v0中,将在fragmentShader中使用,然后在fragmentShader中将所有数据存储在oc中。之后GPU可以开始操作op和oc中的数据了吗?我做对了吗?谢谢
    • 没有连接,两条线做不同的事情。像素和顶点着色器都在 GPU 上按以下顺序执行:顶点着色器 > 顶点裁剪(由 GPU 在内部完成)> 像素着色器。因此,从第一个顶点着色器运行开始,GPU 就开始运行一切。
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2019-09-13
    • 2012-07-22
    • 2013-05-13
    • 2020-04-16
    相关资源
    最近更新 更多