屏幕後處理根據深度紋理構建每個像素在世界空間的位置

1、首先我想先看一下左手座標系和右手座標系,他倆的區別在與z軸的方向是相反的(大拇指是x的方向,食指是y軸的方向)
2、正文:
原理:利用深度紋理和當前幀的視角*投影矩陣的逆矩陣來求得當前像素在世界空間的座標。
我們可以說深度紋理中的深度是來源於NDC中的z座標。

// Get the depth buffer value at this pixel.
//從深度紋理圖中得到當前像素點的深度,這個深度是非線性的深度
//對於Zndc首先他不是一個線性的,爲了得到z01,也就是線性的,我們需要使用Linear01Depth函數對於Zndc計算得到線性的d。
float d = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth);
// H is the viewport position at this pixel in the range -1 to 1.
//NDC和深度紋理圖中的像素深度對應關係是:
//d=0.5*Zndc+0.5;
//(NDC座標是處於(-1,1),但是深度紋理圖中的深度的範圍是處於(0,1)之間的)
//要想得到視角座標系下的NDC座標,首先我們要明確NDC座標的範圍[-1,1],由上面的公式我們可以得到NDC座標中的z座標,但是x和y座標,我們就需要從像素的紋理座標得到也就是i.uv中的x和y座標,但是對於x和y座標的範圍是[0,1]。
float4 H = float4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, d * 2 - 1, 1);
// Transform by the view-projection inverse.
//currentViewProjectionMatrix = camera.projectionMatrix * camera.worldToCameraMatrix;
//Matrix4x4 currentViewProjectionInverseMatrix = currentViewProjectionMatrix.inverse;
//使用當前幀的視角,投影矩陣的逆矩陣對其進行變換。
float4 D = mul(_CurrentViewProjectionInverseMatrix, H);
// Divide by w to get the world position. 
//最後將得到的結果除以w分量得到世界空間下的座標。
float4 worldPos = D / D.w;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章