2016-09-27 73 views
0

這個透視矩陣的第三行的目的是什麼?難道我們不能簡單地保留原始的z座標,並且仍然能夠確定應該在別人面前繪製哪些點?如果我們將單元格(3,3​​)替換爲1並將單元格(3,4)替換爲0,則該點將繪製在正確的x和y位置,並且仍然可以使用點的第四個座標作爲均勻。我錯過了什麼?謝謝!瞭解透視投影矩陣的第三行

enter image description here

+1

我認爲這一行只是將[近,遠]範圍縮放到[0,1]中進行剪裁。在這個轉換之後,你將看到的所有內容都位於[0,1]範圍內,其餘部分將被忽略。 – kolenda

回答

0

是的,理論上可以保持z值,因爲他們得到的可比性。但是,練習不允許這樣做。實際上,這個矩陣不會自行工作。但讓我稍後再談。下面是所得投影Ž相對於輸入的z座標,假定爲1的近裁剪面的圖和爲5的遠裁剪面:

Perspective Z

正如你可以看到,所得到的深度仍然在1和5之間的範圍相同,但有點扣。其原因如下:

將投影后得到的z值(歸一化設備座標)寫入深度緩衝區(OpenGL對窗口座標執行額外轉換,但現在讓我們忽略它) 。深度緩衝區的固定分辨率通常爲24或32位。理論上,你可以將深度編碼爲浮點數,但這會浪費很多精度。在許多情況下,精確的深度緩衝區是必不可少的,以避免閃爍。

所以相反,z緩衝區被編碼爲某種整數,縮放到znear和zfar之間的適當範圍。因此,上圖中的垂直軸被分成相同的步驟。現在屈曲的結果更接近於深度軸上更大範圍內的Zel散佈。因此,如果點靠近攝像機,則某個z範圍編碼的深度範圍較大,如果距離較遠,則深度範圍較小。這樣可以在相機附近獲得更高的精度(請記住深度軸均勻細分)。這通常正是你想要的。可以非常詳細地看到與攝像機非常接近的對象,並且深度緩衝區中的問題會很明顯。然而,距離很遠的物體不能被視爲清晰,並且不需要高深度分辨率。

如前所述,該矩陣不能直接使用。這是因爲標準化器件座標的z值被認爲是在DirectX的[0,1]範圍內或OpenGL的[-1,1]範圍內,其中下部表示近剪裁平面的深度,而上部代表遠剪裁平面。因此,除非應用一些額外的轉換,否則這些API無法使用生成的深度。