2013-05-07 86 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值,它現在可以完美地工作。我不確定這是否是我的軟件或硬件問題,或者這是否在其他地方發現,但至少可以發揮作用!

相關問題