2011-08-23 42 views
6

如果我錯了,請糾正我。 當使用頂點和像素着色器時,我們通常會提供代碼來計算頂點着色器的輸出gl_position。 然後,我們在像素着色器中找到具有輸入gl_FragCoord的ouselves。 OpenGL從gl_position計算gl_FragCoord的操作名稱是什麼?這些是「投影」還是「剪輯座標變換」是否正確? 那麼,這些轉換在這些操作中究竟發生了什麼? 換句話說,gl_FragCoord和gl_position之間的數學關係是什麼,我可以用它來代替openGL函數?在glsl中,用於從gl_position計算gl_fragCoord的公式是什麼?

非常感謝您的任何貢獻。

+0

前段時間我有同樣的問題和疑問,並且在「OpenGL:從GLSL中的窗口空間座標計算眼圖空間座標?」這個問題中自己回答了這個問題,你可以在右邊找到一個鏈接。 – karx11erx

+0

對不起karx11erx,這不是我想要的。其實,我想我想要的是相反的。我不想「沒有項目」,我想投影3D座標到2D屏幕座標。 – wil

+0

您也可以在那裏看到如何做,因爲着色器首先(從光視圖空間)取消投影,然後投影(到查看器屏幕空間)。 – karx11erx

回答

9

gl_Position是在後投影齊次座標。

值得注意的是GL_POSITION是頂點的(4D)的位置,而gl_FragCoord是片段的(2d)的位置。

這種情況發生在所述操作之間是

  1. 原始組件(以產生從3個頂點的三角形,例如)
  2. 削波(即切斷三角形在多個三角形是所有的視圖中,如果它不適合最初)
  3. 視應用
  4. 光柵化(採取這些三角形和生成從它們被覆蓋的片段)

所以,儘管你可以找到公式來轉換任意點,它是從視口的2d空間中的頂點位置表示的,但它本身不是有用的,因爲生成的片段不直接對齊頂點位置。獲得頂點2d座標的公式是

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy/gl_Position.w)/2 

再次,這不是gl_FragCoord。如果您需要更深入的知識,請查看GL規範中光柵化的詳細信息。

我不確定您的意思是「替換openGL函數」,但柵格化並不重要,並且超出了SO答案的範圍。

+0

謝謝你的回答。我的目的是實現陰影貼圖着色器。我通過從光線位置渲染場景(使用光線的「投影矩陣」)來創建深度圖(陰影貼圖),但是,在渲染最終場景的頂點時,我不知道使用哪個座標從地圖獲取陰影數據。我想我可以在創建陰影貼圖時使用光源的「投影矩陣」來獲取gl_position的值,然後在創建陰影貼圖時計算gl_fragCoord的值,以便在正確的位置獲取陰影數據。它可以工作嗎? – wil

+0

@wil:這樣做的典型方法是將世界或視圖空間位置與gl_Position(在不同的輸出中)一起傳遞給片段着色器。這樣,在片段着色器中,正確的內插位置(在視圖或世界空間中,取決於您傳遞的內容)可以通過矩陣進行轉換,使其回到光照空間。簡短的回答是,不要依賴gl_FragCoord,通過你所需要的。 – Bahbar

+0

我不確定你究竟是什麼,但它聽起來不像計算陰影圖。這就是我所指的,聽起來與你自己的事情有很大不同。我建議開一個新的問題,對於你想要解決的問題有一定的瞭解 – Bahbar