在更详细地定义我的问题之前,我想我应该首先解释一下我是如何设置一切的。
基本上我有一个简单的平面网格,定义如下(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
]);
这里没有什么奇怪的事情发生。但是,我渲染这个的方式是一切失败的地方。 它是通过使用两个渲染 channel 来渲染的;第一个是简单的片段着色器,它只是将颜色复制到输出并渲染为 512x512 纹理。 尽管如此,一切都运转良好。我的问题出在第二个渲染过程中。
第二个也是最后一个渲染 channel 渲染相同的几何体,但片段(像素)的颜色应从第一 channel 渲染的纹理中获取。 这就是我的问题所在,我需要一种方法来正确计算屏幕空间坐标中当前像素的位置,或者准确地说是 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 存储库 here .
最佳答案
使用 PIX,我发现传递给片段着色器的 Y 位置与常规 Flash 坐标相比是反转的。这样屏幕的顶部为 1,底部为 -1,而不是相反。通过在进行任何屏幕位置计算之前简单地否定 Y 值,它现在可以完美地工作。我不确定这是否是我这边的软件或硬件问题,或者是否在其他地方找到,但至少它有效!
关于shader - AGAL:计算片段着色器中的屏幕空间位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16427683/