1. 程式人生 > >【概念理解】gluOrtho2D和glViewport的作用&視窗與顯示的關係

【概念理解】gluOrtho2D和glViewport的作用&視窗與顯示的關係

世界座標:

固有座標系,不可改變,沒有偏差。

gluOrtho2D(x_mix, x_max, y_mix, y_max)

用於擷取世界座標系相應區域。在世界座標系中以從(x_mix, x_max)到(y_mix, y_max)的直線為對角線的矩形部分擷取影象,該截圖可以被用於顯示。

視窗大小:

glutInitWindowSize(int width, int height)

width、寬、橫;height、高、豎

部分電腦螢幕有1920*1080個畫素(比如說我的),該語句用於建立width*height個畫素的視窗

以上兩個值無關。

視口大小:

截圖不會適配視窗並直接拉伸,而是需要在視口中顯示並拉伸,視口是截圖在視窗中顯示的區域,即影象只在視口中顯示。

視口大小用於把截圖和視窗聯絡起來。

glViewport(int x, int y, GlLsizei w, Glsizei h)可以設定擷取的影象在視窗的哪一部分顯示。

(x, y)是視口左下角在窗口裡位置的座標;(0, 0)是視窗左下角;w、h是視口的寬和高。截圖就在這一部分顯示。

另外:

視窗在螢幕中的位置由

glutInitWindowPosition(int x, int y)確定,

(x, y)是視窗左上角的位置。

以下是圖例:

 void display()
{
    ……
    glBegin(GL_TRIANGLES);
    glVertex2f(0, 0);
    glVertex2f(0, 100);
    glVertex2f(100, 50);
    glEnd();
    ……
}//畫出了一個三角形

這個三角形的座標值很大,預設的視窗只能顯示[-1, 1]區間的圖形,所以根本顯示不下。通過以下操作來讓三角形顯示出來。

void reshape(GLsizei w, GLsizei y)
{
    ……
    gluOrtho2D(-50, 150, -50, 150);//設定裁剪視窗大小
    glViewport(0, 0, w, h);//設定視區大小
    ……

}

用gluOrtho2D截取出圖形,引數不能太小,不用太大,要顯示完整的三角形就必須要比三角形大。這樣就在世界座標中截出了一張200*200的圖(區域),包含三角形和空白部分(或者說應該叫空黑部分?算了,叫做空餘部分)。

glViewport中的w和h分別是視窗的寬和高。這樣做的目的在於可以將視口設定為視窗大小,相當於影象直接適配視窗且用整個視窗顯示影象。有此可得:(三角形和空餘部分)

若將glViewport的w設為原來的一半,則視口變為原來大小的一半,會使影象適配視窗的一半,可得:(瘦高三角、空餘部分和我畫的紅線,紅線在視窗中央)

因為影象要拉伸適配視口,所以會產生形變。

注意:紅線左右都有黑色的部分,但是意義不同。左側的黑色部分是在世界座標系中擷取的空餘部分;而右側的黑色部分則是未顯示任何影象。

即,若擷取影象的比例和視口比例了不同,則會產生形變。

即使視口大小與視窗大小不同,只要比例相同就不會形變,只是“未顯示任何影象”的區域就多了。