簡體   English   中英

為什么我在OpenGL的透視投影中將Z除以W?

[英]Why do I divide Z by W in a perspective projection in OpenGL?

我想這是一個數學問題而不是OpenGL問題,但我離題了。 無論如何,如果透視划分的整個目的是獲得可用的x和y坐標,為什么還要將z除以w呢? 另外我如何在第一時間獲得w?

實際上,解釋與深度緩沖區的限制有很大關系,而不是數學。

最簡單的是,“深度緩沖區是一種紋理,其中每個屏幕上的像素都根據其與相機的距離分配灰度值。這使得視覺效果可以隨着距離輕松改變。” 資源

更准確地說,深度緩沖區是包含每個片段z / w值的紋理,其中:

  • Z是從近剪裁平面到片段的距離。
  • W是攝像機到片段的距離。

在下圖中,說明了zwz / w之間的關系, n等於傳遞給gluPerspectivezNear參數或等效函數, f等於傳遞給同一函數的zFar參數。

說明* z *,* w *和* z * / * w *之間關系的圖

乍一看,這個系統看起來不直觀。 但結果是, z / w總是0到1(0 / nf / f )之間的浮點值,因此可以表示為紋理的單個通道。

第二個重要注意事項:深度緩沖區是非線性的,這意味着在深度緩沖區中,近距離和遠距離剪切平面之間的對象遠未接近0.5的值。 如上所示,它將與深度緩沖區中的值0.999相關聯。 根據您的觀點,這可能是好的也可能是壞的; 你可能希望深度緩沖區更加詳細(特寫),或者提供整個細節(它沒有)。

TL; DR:

  • 您將z除以w,因此它始終在[0,1]范圍內。
  • W是攝像機到片段的距離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM