今天遇到一個奇怪的問題,屏幕後處理時使用_CameraDepthTexture還原世界座標的時候出問題了,多番調試發現_CameraDepthTexture中保存的深度值 depth = 1 - Zn (Zn指NDC的z分量,即透視除法後的座標z)(假設NDC座標取[0, 1]),至於爲什麼要這樣可以看看下面的文章
Reversed-Z詳解-幽玄
Nvidia的關於Reverse-Z的文章
我的理解:
當相機是透視投影模式的時候Zn是非線性的,Zn和相機空間下Z軸的關係如下:
從圖中可以看出,近裁剪平面的少數Z佔用了[0, 1]區間中0附近大範圍的值,然後Y軸改成1-Zn如下圖
上面的圖乍一看然並卵啊,不還是近裁剪平面的少數Z佔用了[0, 1]區間中1附近大範圍的值,其實非也,因爲0值附近的符點數擁有更好的精度,爲什麼這麼說呢,因爲計算機保存浮點數有個特點,以float類型爲例
0.000101011在計算機中會被保存爲1.01011*2^-4,而1.000101011則還是1.000101011
所以上圖 中看似近裁剪平面佔用了1附近大範圍的區間,但是0附近的區間精度是高於1附近的區間的,由此正好彌補了分佈規律的缺陷。