【概念理解】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設為原來的一半,則視口變為原來大小的一半,會使影象適配視窗的一半,可得:(瘦高三角、空餘部分和我畫的紅線,紅線在視窗中央)
因為影象要拉伸適配視口,所以會產生形變。
注意:紅線左右都有黑色的部分,但是意義不同。左側的黑色部分是在世界座標系中擷取的空餘部分;而右側的黑色部分則是未顯示任何影象。
即,若擷取影象的比例和視口比例了不同,則會產生形變。
即使視口大小與視窗大小不同,只要比例相同就不會形變,只是“未顯示任何影象”的區域就多了。