AGAL:计算片段着色器中的屏幕空间位置

时间:2013-05-07 20:10:41

标签: shader fragment-shader stage3d molehill agal

在我更详细地定义我的问题之前,我想我应该首先解释我是如何设置一切的。

基本上我有一个简单的平面网格,定义为(x,y,z,u,v):

_vertices = Vector.<Number>([
    -1, -1, 0, 0, 0,
    1, -1, 0, 1, 0,
    1,  1, 0, 1, 1,
    -1,  1, 0, 0, 1
]);

_indices = Vector.<uint>([
    0, 2, 1,
    0, 3, 2
]);

这里没有任何幻想。但是,我渲染它的方式就是它全部落空的地方。 它通过使用两个渲染过程渲染;第一个是简单的片段着色器,它只是将颜色复制到输出并呈现为512x512纹理。 不过,一切都运转良好。它是在第二个渲染过程中我的问题所在。

第二个也是最后一个渲染过程渲染相同的几何体,但是应该从第一遍渲染的纹理中获取fragmen(像素)的颜色。 这就是我的问题所在,我需要一种方法来正确计算屏幕空间坐标中当前像素的位置,或准确地计算UV坐标,以便从纹理中正确地提取它们。

我已经做过一些关于如何计算这个位置的研究,但是不知怎的,我最终创造了一个类似万花筒的效果。但是,只有在X轴或Z轴上旋转网格而不是Y轴时,此效果才会显现,如此处所示

Rotation comparisons

用于第二遍的片段程序,即创建此效果的程序,看起来像这样

div ft0.x, v0.x, v0.w    // Divide vertex positions (v0.xy) with clip-space position (v0.w)
div ft0.y, v0.y, v0.w    // to obtain screen coordinates as -1,1

mul ft0.x, ft0.x, fc0.x    // Multiply positions (ft0.xy) by 0.5 (fc0.x)
mul ft0.y, ft0.y, fc0.x 

add ft0.x, ft0.x, fc0.x    // Finally add 0.5 (fc0.x) to positions (ft0.xy)
add ft0.y, ft0.y, fc0.x

tex ft1, ft0.xy, fs0 <2d, nearest, repeat, nomip>    // Simply copy the pixel at (ft0) from the render buffer (fs0)
mov oc, ft1";

最后,我对这一切都很陌生。所以我可能会遗漏一些明显的东西,因此我提前道歉。

如果你想查看所有不存在的荣耀中的代码,可以找到Github repo here

1 个答案:

答案 0 :(得分:2)

使用PIX我发现,与常规Flash坐标相比,传递给片段着色器的Y位置被反转。这样屏幕的顶部是1,底部是-1,而不是反之亦然。通过在进行任何屏幕位置计算之前简单地否定Y值,它现在可以完美地工作。我不确定这是否是我身边的软件或硬件问题,或者是否在其他地方找到了,但至少它有效!