我想這是一個數學問題,而不是OpenGL的問題,但我離題了。無論如何,如果透視分割的全部目的是獲得可用的x和y座標,爲什麼麻煩將z除以w?另外我怎樣才能獲得w?爲什麼我用W在OpenGL的透視投影中將W除以W?
回答
實際上,這個解釋與深度緩衝區的侷限性有很大關係。
簡單來說,「深度緩衝區是一種紋理,其中每個屏幕上的像素都會根據其離攝像機的距離分配一個灰度值,從而使視覺效果可以隨距離輕鬆改變。 Source
更準確地說,一個深度緩衝器是含有ž/的瓦特值對於每個fragment,其中紋理:
- Ž是從近裁剪面的距離到片段。
- W是從相機到片段的距離。
在示出Ž,瓦特,和ž /瓦特之間的關係在下圖中,Ñ等於zNear
參數傳遞給gluPerspective
或等效的功能,和f等於參數zFar
傳遞給同一個函數。
一目瞭然,這個系統看起來不直觀。但作爲一個結果,ž /瓦特總是0和1之間的浮點值(0/Ñ和˚F/˚F),並且因此可以被表示爲一個單信道質地。
第二個重要注意事項:深度緩衝區是非線性的,這意味着深度緩衝區中精確位於近距離和遠距離剪切平面之間的物體無法接近0.5值。如上所示,它將與深度緩衝區中的值0.999相關聯。根據你的觀點,這可能是好的或壞的;你可能希望深度緩衝區更加詳細的特寫(它是),或者在整個過程中提供更詳細的信息(它沒有)。
TL; DR:
- 您劃分Ž通過瓦特所以它總是在範圍[0,1]。
- W是從相機到片段的距離。
我真的不完全同意這個答案,這個問題屬於純數學問題,這裏解釋的是opengl和z-buffer算法的實現細節(深度緩衝區)。 – 2014-08-31 14:05:32
NDC中的z在範圍[-1,1]中,而不是[0,1],這是DirectX約定。 – SnappleLVR 2017-05-30 13:26:51
- 1. 「W」打印出W,「W」打印出$。爲什麼?
- 2. OpenGL 3.2 w/NSOpenGLView
- 3. Email validation expression \ w +([ - +。'] \ w +)* @ \ w +([ - 。] \ w +)* \。\ w +([ - 。] \ w +)*允許空格
- 4. %w和%W之間有什麼區別
- 5. 屏幕位置逆投影,而不W¯¯
- 6. C++ STL - 爲什麼要用(W <* I),而不是(W == * I)
- 7. 爲什麼這種模式不匹配? ([\\\\ A \\\\ W]其中[\\\\ W \\\\ z])
- 8. 棋盤w/openGL glRecti
- 9. Ruby中的%w {}和%W {}大小寫W數組字面量有什麼區別?
- 10. 在PHP fopen函數中,w和w +模式有什麼區別?
- 11. is re.split(「\ W」)= re.split(「\ w」)?
- 12. 這兩個命令之間的區別(w&w/out「」)以及爲什麼?
- 13. SQL查詢W /淨#投票
- 14. 設置opengl透視投影
- 15. OpenGL ES透視投影
- 16. 數據透視表w/out函數
- 17. Android - OpenGL不顯示w/emulator?
- 18. 是什麼分裂( 「\\ W」)和分離之間的差值( 「[^ \\ W']」)
- 19. 自動ctrl-w w到vimrc
- 20. 是(\ w +)?和(\ w *)一樣嗎?
- 21. 幻影類型w/AnyVal?
- 22. 這是什麼意思? Z = A(xxx:xxx + w-1,yyy:yyy + w-1,:);
- 23. 與NA(W)和NB(W)在語言
- 24. OpenGL中的透視投影矩陣
- 25. 爲什麼「append('w')」返回無?
- 26. 爲什麼JavaScript RegExp/^ \ w + $/match未定義?
- 27. R中的人口金字塔w投影
- 28. C++爲什麼`observer_ptr <W>`有一個帶`W *`的構造函數?
- 29. 爲什麼轉義'w'('\ w')字符會顛倒int變量的內存表示?
- 30. 在正則表達式中,「(\ w){3}」和「(\ w {3})」有什麼區別?
http://en.wikipedia。org/wiki/Transformation_matrix#Perspective_projection – 2014-08-30 16:46:51
這與均勻座標有關。他們映射R^3 - > R^4顯然不是一對一的。 w因子可以'cannonized'爲1.但是應用4x4矩陣算子的結果'w'可能會改變。如果我沒有記錯,均勻座標的一個優點是將翻譯作爲線性算子。 – Yotam 2014-08-30 17:53:34