我目前從場着色器的一個後處理深度的深度紋理使用以下GLSL代碼讀取:轉換的深度紋理樣本的距離
vec4 depthSample = texture2D(sDepthTexture, tcScreen);
float depth = depthSample.x * 255.0/256.0 +
depthSample.y * 255.0/65536.0 +
depthSample.z * 255.0/16777216.0;
然後深度值轉換爲視覺空間基於近及遠平面距離的距離:
float zDistance = (zNear * zFar)/(zFar - depth * (zFar - zNear));
這一切似乎工作得相當好,但是我想知道怎麼做只對當前的投影矩陣根據上面的計算,而無需單獨zNear
和zFar
值。
我的初始嘗試涉及由投影矩陣的逆矩陣相乘(vec4(tcscreen.x, tcScreen.y, depth, 1.0) * 2.0 - 1.0)
,通過將結果除以w
,然後取所得z
值作爲距離,但這似乎沒有工作。這裏的正確方法是什麼?
此外,當使用斜截頭截頭將近平面移到選定的截取平面上時,近平面距離現在可能對每個像素有所不同?如果是這樣,那麼這是否意味着任何計算距深度紋理的距離的着色器都需要知道這種情況,而不是假設常量接近平面距離?
謝謝!
我的確有相反的問題,所以你的問題陳述最終成爲我的解決方案。謝謝, – imallett 2013-05-31 20:38:56