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

标签 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
]);

这里没有什么奇怪的事情发生。但是,我渲染这个的方式是一切失败的地方。 它是通过使用两个渲染 channel 来渲染的;第一个是简单的片段着色器,它只是将颜色复制到输出并渲染为 512x512 纹理。 尽管如此,一切都运转良好。我的问题出在第二个渲染过程中。

第二个也是最后一个渲染 channel 渲染相同的几何体,但片段(像素)的颜色应从第一 channel 渲染的纹理中获取。 这就是我的问题所在,我需要一种方法来正确计算屏幕空间坐标中当前像素的位置,或者准确地说是 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 .

最佳答案

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

关于shader - AGAL:计算片段着色器中的屏幕空间位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16427683/

相关文章:

c++ - Opengl 片段着色器仅以白色绘制

opengl - 如何使用 GPU 高效地渲染和处理视频流?

ios - 如何确定点是否位于形状内?

actionscript-3 - Stage3D 中的阴影转换着色器

ios - 使用GPUImage在OpenGL ES着色器中具有 boolean 返回类型的函数

ios - Adobe Air App 最低 IOS 版本

c - Stage3D 和 pthreads

javascript - 从 Shadertoy 导出到 Three.js

c++ - OpenGL 中片段着色的伪像

flash - 将纹理 (BitmapData) 渲染到 2D 空间中的 Stage3D 所需的低级代码是什么?