opengl 中的透視除法和NDC

歸一化設備座標
OpenGL的座標空間是[-1, 1],x,y軸超過該區域的都將被切掉 看不見。
viewport像素是 1280 X 720,歸一化後坐標空間從[1280X720],映射到[-1,1]

問題:導致物體變形,因爲 x,y軸座標長度都是1 - (-1)= 2,但x,y軸像素數量不同。y軸像素少,單位座標就會變長。
辦法:設短的軸映射爲1,長的軸根據與短軸的比例 映射。[0, 1280] ,[0, 720]--->[-1280/720 , 1280/720],[-1, 1]。這個空間被稱作虛擬座標空間。

 

OpenGL最終的渲染設備是2D的,我們需要將3D表示的場景轉換爲最終的2D形式,前面使用模型變換和視變換將物體座標轉換到照相機座標系後,需要進行投影變換,將座標從相機—》裁剪座標系,經過透視除法後,變換到規範化設備座標系(NDC),最後進行視口變換後,3D座標才變換到屏幕上的2D座標,這個過程如下圖所示:

 

在光柵化階段會做透視分割(或透視除法,即除以第四個分量)。

W 分量是投影儀到屏幕的距離。

在3D計算機圖形學中,透視是通過投影矩陣變換,改變每一個向量中 W 分量的值來實現透視的。

透視除法只是將齊次座標中的 W 分量轉換爲1的專用名詞。

 

這裏需要注意以下,對於attribute類型的屬性量。OpenGL會用默認的值替換屬性中未指定的分量,前三個分量會被設定爲0,最後一個分量w會被設定爲1.

 

圖元裝配階段,它實際上做了以下幾件事:剪裁座標、透視分割、視口變換(視變換是將NDC座標轉換爲顯示屏幕座標的過程,使用線性映射)。圖元裝配的輸入是頂點着色器的輸出,是物體座標gl_Position,之後到光柵化階段。

站在gl_position的角度來說,[-w,w]之間的座標點纔是可見的,否則都是不可見會被剪裁掉。往前看,在做投影變換的時候我們說,在視景體內的物體有效,視景體外的會被剪裁,實際上是對應的,剪裁就是發生在圖元裝配階段判斷所有的座標是否在[-w,w]之間。

剪裁實際上就是判斷每一個最小三角形、直線、點單元的座標是否規範。

透視除法

對上面的剪裁座標的點的x、y、z座標除以它的w分量,除以w的座標叫做歸一化設備座標。如果w分量大,除以w後的點就接近(0,0,0),在三維空間中,距離我們較遠的座標如果它的w分量較大,進行透視除法後,就距離原點越近,原點作爲遠處物體的消失點,就有三維場景的效果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章