UnityShader Reversed-Z的理解

今天遇到一個奇怪的問題,屏幕後處理時使用_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附近的區間的,由此正好彌補了分佈規律的缺陷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章