1.1 窗口(Screen)
窗口其實就是屏幕,如下圖1中紅色圈中黑色背景的部分。所有的場景最終都是要被光柵化乘顯示器上的圖像,屏幕是所有場景(2D、3D等)的最終輸出目的地。壹個screen可以顯示多個視口中的內容;
1.2 視口(Viewport)
視口就是窗口中用來顯示圖形的壹塊矩形區域,它可以和窗口等大,也可以比窗口大或者小,如圖1中藍色標示的綠色背景的區域。它具有兩個意義:
? 定義了視鏡體中的景物要被繪制到壹張什麽尺寸的畫布之上;
? 定義了畫布在屏幕的什麽區域;
顯然,如果 視景體的投影平面 定義的寬高比和 視口 所定義的寬高比 不相同 的話,那麽將視景體中的物體繪制到畫布上的時候會進行 拉伸或者壓縮 ;而當視景體投影平面的寬高比和視口所定義的寬高比壹致的時候,圖像將會不進行任何縮放繪制到視口所定義的畫布之上。
在實際應用中,壹個窗口中會繪制多個3D場景,這個通過定義多個視口,繪制多個圖像,然後 貼在 屏幕的不同區域即可。比如圖中黃色筆圈中的區域,在畫布中定於兩個不同的viewport1 (0,0;w/2,y)和 viewport2 (0,w/2;w/2,y);
1.4 視鏡體(View Frustum)
視景體(View Volume)定義了我們能夠通過虛擬的3D攝像機所能看到的場景。在壹個3D場景中站立中,需要攝像機的 擺放位置 和 視野 來定義我們所能夠看到的東西,而這個視野就是通過視景體來定義的。在3D中,壹般可以通過以下兩種方式來定義視景體:
通過前面的介紹,我們大致的了解了這三個不同東西的概念。從中我們可以知道,通過定義投影矩陣,我們實際上是在虛擬的3D空間中,創建了壹個視野,也就是視景體。在接著,我們通過定義視口,來描述視景體中的內容如何映射到壹個虛擬的畫布之上,並且這個畫布最終將顯示在屏幕上的什麽位置。當所有的這些都設置完畢,我們繪制完畢場景之後,就能夠通過硬件在我們的顯示器屏幕上看到最終的畫面。更理論的表述就是,通過定義投影矩陣,將3D場景投影到壹個投影平面之上。通過定義視口,我們將投影平面上的內容映射到這個視口中去,並且填滿它,同時根據定義視口是給定的屏幕坐標的位置,將這個視口中的圖像映射到窗口的指定位置之上,最終我們就看到了圖像。
glViewport是OpenGL中的壹個函數。計算機圖形學中,在屏幕上打開窗口的任務是由窗口系統,而不是OpenGL負責的。glViewport在默認情況下,視口被設置為占據打開窗口的整個像素矩形,如圖1,窗口大小和設置視口大小相同,所以為了選擇壹個更小的繪圖區域,就可以用glViewport函數來實現這壹變換,在窗口中定義壹個像素矩形,最終將圖像映射到這個矩形中。例如可以對窗口區域進行劃分,在同壹個窗口中顯示分割屏幕的效果,以顯示多個視圖。