unity中取樣深度圖的結果處理

js0907發表於2020-12-03

此篇內容是基於深度圖的應用的說明,對深度圖不清楚的,請檢視:
深度圖的說明

  1. 關於相機的深度側檢視:
    在這裡插入圖片描述深度:存的是Z值,不是此點到相機的距離(例如 G點的深度是AH,但是AG是G點到相機的距離)
    (1)第二個函式 LinearEyeDepth
    此函式返回就是相機空間中的Z值
    (2)第一個函式:Linear01Depth
    此函式的返回值是(0,1)的線性值,也是相機空間(視角空間)中的
    0:相機的位置是0
    1:遠裁剪平面是1
    在相機空間中的Z值是深度最原始的值,將Z值/原裁剪平面far,就轉換到了(0,1)的範圍內
    此處附上《Shader入門精要》中的推到過程:
    取樣深度圖推導過程請點選此處檢視。

下面通過深度圖重建世界座標系:

(方法一)逆矩陣方式重建

:在frag著色器中得到uv座標(已經進行過齊次除法,且已經由【-1,1】換算到【0,1】),取樣深度圖得到Clip裁剪空間中的Z值
所以就得到了Clip裁剪空間中的 座標(x,y,z).然後乘以VP矩陣的逆矩陣,就轉換到世界空間中的座標(記得/.w)
下面是逆推的演示:
條件:已知條件(M為VP矩陣,M^-1即為其逆矩陣,Clip為裁剪空間,ndc為標準裝置空間,world為世界空間):
(1)
ndc = Clip.xyzw / Clip.w = Clip / Clip.w

world = M^-1 * Clip

二者結合得:

world = M ^-1 * ndc * Clip.w
(2)
我們已知M和ndc,然而還是不知道Clip.w,但是有一個特殊情況,是world的w座標,經過變換後應該是1,即

1 = world.w = (M^-1 * ndc).w * Clip.w

進而得到Clip.w = 1 / (M^ -1 * ndc).w

帶入上面等式得到:

world = (M ^ -1 * ndc) / (M ^ -1 * ndc).w

所以,世界座標就等於ndc進行VP逆變換之後再除以自身的w。
(3)缺點
不過這種方式重建世界座標,效能比較差,一般來說,我們都是逐頂點地進行矩陣運算,畢竟定點數一般還是比較少的,但是全螢幕逐畫素進行矩陣運算,這個計算量就不是一般的大了,效能肯定是吃不消的。

(方法二):螢幕射線插值方式重建視空間座標

在這裡插入圖片描述假如我們得到了 相機在世界空間中的位置A,並且已知一個方向向量AG
那麼:G點在世界空間中的位置 = 世界空間相機位置A 沿著AG方向 平移AG的長度

程式碼和實現方式如下:

重建世界座標系

相關文章