2014-11-23 66 views
0

瞭解z戰鬥如何工作我得到了這個問題。z戰鬥的數學視圖

考慮在本地座標系 攝像機中給出的點p = (0, 0, −500)。導出 上述流水線不同階段中分配給p的深度值,即導出眼圖空間中p的深度值, 歸一化設備座標([−1, 1]),範圍[0,1]和最終深度 緩衝值,n = 200,f = 1000,m = 24

我覺得這個程序的secound步驟是:z1=z * -(f+n)/(f-n) - 2fn/(f-n) 從預期的轉換矩陣。 之後z2= (1/2)*z1 + 1/2

但我不知道如何轉換應該看起來像在眼睛空間和最後一步是什麼。

我希望有人能幫助我:)`

+0

最後一步是均勻分割,即v'= v/v.w - 然而要理解Z戰鬥這是無關緊要的。 Z-格鬥是由幾乎相同邊界值(頂點位置)的插值中的數值舍入誤差引起的,導致某些排序算子(<, >等)的變化。 – datenwolf 2014-11-23 12:09:49

回答

0

對象空間(「局部座標系」),讓你不得不採取模型(對象到世界)和視圖(世界來 - 眼)轉換考慮在內。通常,這些是由某些矩陣描述的仿射變換。由於世界空間並非明確需要,因此模型和視圖變換可以組成模型視圖矩陣。這就是舊的GL固定功能管道的工作方式。

由於不清楚到底給出了什麼,我只是假設我們知道矩陣,或者可以根據給定的方法來確定/計算它們。由於您只需要z_eye,因此您可以將這些矩陣的第三行的點積與您的輸入矢量p(正如您在投影時所做的那樣)一起使用。

投影后,你得到了clip space,需要做w_clip的均勻除法 - 這意味着僅計算z是不夠的。您還需要應用投影矩陣定義的w座標。在典型情況下,w_clip=-z_eye。但在一般情況下,你可能會得到別的東西。這意味着您也可能需要x_eye,y_eyew_eye,因爲模型和視圖轉換可能不是仿射(非常不可能),請使用w(縮放的粗略方式)或投影方向與z軸不相同(仍然不太可能,但理論上完全可能)。

z_ndc=z_clip/w_clip之後,您需要視口變換。在默認情況下,OpenGL會將範圍[-1,1]轉換爲[0,1],並且您的問題假定爲相同。最後,該值被轉換爲最終格式。由於默認情況下使用整數深度緩衝區,因此[0,1]範圍線性映射到[0,max],並忽略小數部分。 你的隊列似乎表明使用了一個24位深度緩衝區,所以max=2^24-1