2013-05-07 51 views
2

在我更详细地定义我的问题之前,我想我应该从解释我如何设置所有内容开始。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纹理。 仍然,一切工作正常。它在我的问题所在的第二个渲染过程中。

第二次也是最后一次渲染通道呈现相同的几何体,但是应该从第一次渲染渲染的纹理中提取碎片(像素)的颜色。 这就是我的问题出现的地方,我需要一种方法来正确计算当前像素在屏幕空间坐标或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回购可以找到here

回答

2

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

相关问题