2

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

基本上我有一个简单的平面网格,定义如下(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 轴上,如此处所示

轮换比较

用于第二遍的片段程序,即创建此效果的片段程序,如下所示

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 存储库。

4

1 回答 1

2

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

于 2013-05-09T12:19:01.427 回答