2015-08-09 225 views
2

投影矩陣投影到子空間從較高維空間中的向量。我本來期望在OpenGL投影矩陣投影中的R 3 一個點到2維平面。這似乎得到了互聯網上很多文獻的支持。許多網站暗示投影矩陣將3D世界投影到飛機上,這就是繪製的。不過,我感覺大多數這些解釋都在跳過幾個步驟。他們中的許多人似乎互相矛盾,所以我想要澄清我從我自己的分析中得出的結論。OpenGL中的投影矩陣真的是「投影矩陣」嗎?

可有人請確認(或如果錯誤是正確的)是:

  1. 在OpenGL的投影變換是不實際的投影矩陣,而是把一個點到剪輯空間(這仍然是一部分將R 3 )和實際投影到二維平面上後發生,因爲管道的固定功能。
  2. 投影矩陣不適用的透視分割;但是它確實需要設置w座標,以便稍後發生透視分割(作爲管線的固定功能),點正確放置在NDC的內部或外部。
  3. 剪輯空間上的X,Y軸之間的箱(-1,+ 1),和(n,f)關於z軸而NDC是介乎一個盒子(-1,+ 1)上的所有軸。

我分析以下投影矩陣來上述結論:

[ 2n/(r-l)  0  (r+l)/(r-b)  0  ] 
[ 0  2n/(t-b) (t+b)/(t-b)  0  ] 
[ 0   0 -(f+n)/(f-n) -2fn/(f-n) ] 
[ 0   0   -1   0  ] 

從那個分析我的結論是,這是截錐內的任何點會沿x,y中的剪輯的邊界內軸;它可能在沿着z軸的邊界之外,但是一旦發生透視分割(現在w是舊的-z),該點將完全位於剪輯空間內。

由此我也得出結論:對於MVP轉換後可見的點,它的x,y和z/w座標必須在+/- 1之間,並且透視分割和實際投影發生在頂點之後着色器。

如果具體到現代的OpenGL(3.3內核或更高版本)適用的答案只有請。

回答

3
  1. OpenGL中的投影矩陣將點轉換成剪輯空間。但這已經是一個預測。在矩陣乘法之後唯一必須做的是視角分隔。

  2. 剪輯空間是從[-w爲w]上的每個軸的空間中,因爲該剪輯空間和NDC之間發生的唯一操作是透視分割。 NDC從每個軸上的[-1到1]。

其他備註:

  • 在數學上,一個OpenGL投影矩陣映射四維空間(P^4)到另一個4D空間(剪切空間)。這可以通過矩陣的形式很容易地看出(4×4矩陣映射4D→4D)。通過透視分割,4D剪輯空間被均勻化截斷爲3D NDC(R^3)空間。
  • 點在投影后可見,當它的x,y,z座標介於[-w,w]之間時。裁剪之所以發生在視角分割之前,是因爲NDC不一定是立方體空間(它在OpenGL中是一個,但是在DirectX中,例如,NDC是x,y在[-1,1]中,y在[0, 1])
  • 幾何投影一般定義爲從一個空間(O)到另一個空間(T)的映射P.這將被寫爲

    O --p--> T

    在某些情況下可以通過在歐幾里德空間中的改造的探討矩陣(平行投影,例如,將工作)來描述這樣的映射,但在很多情況下,這是不可能(尤其是在O中的平行線不再與T平行的情況下)。這就是爲什麼需要投影空間的原因。

我現在好多了停在這裏,因爲它變得越來越從數學的角度看更復雜,但如果你想挖掘更多的進入這個話題,我建議下面的文章:

Wikipedia Projective Space
Wikipedia Projective Geometry
Video about projection in general (this, and the next one)

0

我想這取決於如何定義exactrly「預測」了許多。維基百科介紹mathematical projections如下:

在數學中,投影是一組(或其它 數學結構)的成子集的映射(或子結構),這是 等於其用於映射組合物方(或換句話說,哪個是冪等的)。

換句話說,應用投影兩次不會進一步改變結果。很容易看出,如果將3D點投射到嵌入該空間的任何2D平面,則此屬性已滿。

但是,用於渲染3D圖形的典型「投影」矩陣不符合該條件。 「投影」這個術語有點鬆動。 我們實際上不希望將3D點投影到信息丟失的2D子空間。例如,我們希望將深度信息保留在屏幕空間中,以便能夠進行深度測試。所以在概念上,即使在「視角鴻溝」之後,我們仍然擁有3D空間。並且GL的窗口空間被明確定義爲3維,具有窗口空間z值。當然,只有x和y用於尋址顏色緩衝區中的像素,但是每個生成的片段都有它的z值。

我聽到到不同此類操作的從如上所述是「透視變換」,這可能更有道理從數學的角度來看嚴格的數學突起的術語。這些好處在於它們是可逆的(在一定程度上/由於映射在鏡像前面的鏡頭背後的物體的視覺差異而涉及模糊,但是這些位於視錐體之外並且通常不構成一個問題)。