2014-08-30 59 views
8

我想這是一個數學問題,而不是OpenGL的問題,但我離題了。無論如何,如果透視分割的全部目的是獲得可用的x和y座標,爲什麼麻煩將z除以w?另外我怎樣才能獲得w?爲什麼我用W在OpenGL的透視投影中將W除以W?

+0

http://en.wikipedia。org/wiki/Transformation_matrix#Perspective_projection – 2014-08-30 16:46:51

+0

這與均勻座標有關。他們映射R^3 - > R^4顯然不是一對一的。 w因子可以'cannonized'爲1.但是應用4x4矩陣算子的結果'w'可能會改變。如果我沒有記錯,均勻座標的一個優點是將翻譯作爲線性算子。 – Yotam 2014-08-30 17:53:34

回答

12

實際上,這個解釋與深度緩衝區的侷限性有很大關係。

簡單來說,「深度緩衝區是一種紋理,其中每個屏幕上的像素都會根據其離攝像機的距離分配一個灰度值,從而使視覺效果可以隨距離輕鬆改變。 Source

更準確地說,一個深度緩衝器是含有ž/的瓦特值對於每個fragment,其中紋理:

  • Ž是從近裁剪面的距離到片段。
  • W是從相機到片段的距離。

在示出Ž瓦特,和ž /瓦特之間的關係在下圖中,Ñ等於zNear參數傳遞給gluPerspective或等效的功能,和f等於參數zFar傳遞給同一個函數。

Diagram illustrating the relationship between *z*, *w*, and *z*/*w*

一目瞭然,這個系統看起來不直觀。但作爲一個結果,ž /瓦特總是0和1之間的浮點值(0/Ñ˚F/˚F),並且因此可以被表示爲一個單信道質地。

第二個重要注意事項:深度緩衝區是非線性的,這意味着深度緩衝區中精確位於近距離和遠距離剪切平面之間的物體無法接近0.5值。如上所示,它將與深度緩衝區中的值0.999相關聯。根據你的觀點,這可能是好的或壞的;你可能希望深度緩衝區更加詳細的特寫(它是),或者在整個過程中提供更詳細的信息(它沒有)。

TL; DR:

  • 您劃分Ž通過瓦特所以它總是在範圍[0,1]。
  • W是從相機到片段的距離。
+4

我真的不完全同意這個答案,這個問題屬於純數學問題,這裏解釋的是opengl和z-buffer算法的實現細節(深度緩衝區)。 – 2014-08-31 14:05:32

+0

NDC中的z在範圍[-1,1]中,而不是[0,1],這是DirectX約定。 – SnappleLVR 2017-05-30 13:26:51

相關問題