2014-09-29 62 views
0

我在獲取存儲在Float紋理中的深度值(或者我不明白值)時遇到了一些問題。基本上我創建了一個渲染渲染器,並且在其中一個傳遞中,我將深度存儲在浮點渲染目標的alpha組件中。該着色器的代碼看起來是這樣的在後期處理中獲取來自Float紋理的深度

定義夾位置變化

varying vec4 clipPos; 

... 在頂點着色器指定的位置

clipPos = gl_Position; 

現在在片段着色器我店深度:

gl_FragColor.w = clipPos.z/clipPos.w; 

這個大大的作品。當我在任何後續着色器中訪問此渲染目標時,我可以獲得深度。即是這樣的:

float depth = depthMap.w; 

我是正確的假設,0.0表示就在鏡頭前和1是在距離?因爲我正在做一些基於這個霧計算,但他們似乎並不正確。

fogFactor = smoothstep(fogNear, fogFar, depth); 

霧附近和霧霧是我發送到着色器的制服。當fogNear設置爲0時,我會認爲我可以從鏡頭前方的右側平滑地過渡到它的繪製距離。然而,這是我所看到的: enter image description here

當我設置fogNear到0.995,然後我得到更多的東西像什麼林期待:

enter image description here

那是正確的,它只是似乎並不對我來說? (幾何體的規模着實不小/過大,也不是附近的攝像頭和過於龐大的所有值是相當合理的。)

+0

什麼是您的zNear和zFar設置在您的透視矩陣? – gman 2014-09-30 09:14:44

+1

你可能會覺得這個答案有用http://stackoverflow.com/a/21106656/128511 – gman 2014-09-30 09:16:42

回答

3

有兩個問題你的方法:

  1. 假設深度在[0,1]範圍內,請使用clipPos.z/clipPos.w,這是NDC z座標在[-1,1]範圍內。您可能會更好地將窗口空間z座標寫入深度紋理,該深度紋理位於[0,1]中,並且將簡單地爲gl_FragCoord.z

  2. 您假定線性深度映射的更嚴重問題。但是,情況並非如此。 NDC和窗口空間z值不是攝像機平面距離的線性表示。在屏幕截圖中看到的任何內容與1非常接近並不令人驚訝。典型的霧計算是在眼睛空間中完成的。但是,由於您只需要z座標,因此您可以簡單地存儲座標空間座標 - 因爲通常情況下,這只是-z_eye(查看投影矩陣的最後一行)。然而,結果值不會在任何正常範圍內,但是在您的投影矩陣中使用[near,far],但指定眼圖空間單位中的霧距(通常與世界空間單位相同)更直觀。