1. 程式人生 > >【學習OpenGL】(二)——繪製矩形(視口與裁剪區)

【學習OpenGL】(二)——繪製矩形(視口與裁剪區)

繪製矩形

在前面第一個建立視窗的程式的基礎之上,新增繪製矩形的函式

#include <gl/glut.h>

void RenderScene(void)
{
    // 用當前的清除顏色清除視窗
    glClear(GL_COLOR_BUFFER_BIT);
    // 把繪圖顏色設定為紅色
    //         R    G    B
    glColor3f(1.0f,0.0f,0.0f);
    // 用當前顏色繪製一個填充的矩形
    glRectf(-25.0f, 25.0f, 25.0f, -25.0f);
    // 重新整理繪圖命令
    glFlush();
}

// 設定渲染狀態
void SetupRC(void) { // 把清除顏色設定為藍色 glClearColor(0.0f, 0.0f,1.0f, 1.0f); } // 當視窗改變大小時 void ChangeSize(GLsizei w, GLsizei h) { GLfloat aspectRatio; // 防止被0除 if(h == 0) { h = 1; } // 把視口設定為視窗大小 glViewport(0, 0, w, h); // 重置座標系統 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 建立裁剪區域(左、右、底、頂、近、遠)
aspectRatio = (GLfloat)w / (GLfloat)h; if(w <= h) { glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0); } else { glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main() { glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutCreateWindow("GLRect"
); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); SetupRC(); glutMainLoop(); }

執行結果:

這裡寫圖片描述

繪製矩形

glColor3f(1.0f,0.0f,0.0f);

把當前的繪圖顏色設定為紅色,該函式設定的是圖形的填充顏色,而不是視窗的背景色。

glRectf(-25.0f, 25.0f, 25.0f, -25.0f);

glRectf函式的四個引數表示了兩個座標對,
前面兩個引數為(X1,Y1),表示矩形的左上角,
後面兩個引數為(X2,Y2),表示矩形的右下角。

視窗的縮放

glutReshapeFunc(ChangeSize);

在所有的視窗環境中,使用者都可以在任何時候改變視窗的大小。當視窗大小被改變時,視窗通常會作出響應,根據新的視窗的大小重新繪製它的內容。

設定視口

glViewport(0, 0, w, h);

視窗:OpenGL裡面所謂的視窗就是我們創建出來的視窗,也叫做螢幕視窗,我們可以在這整個窗口裡面繪圖。它是以畫素為單位進行度量的。

視口:而視口則是視窗的一個子區域,通過設定視口就可以把繪圖區域限定為視窗的一個子區域,而這個子區域的別名就叫做視口。即在視窗中可以見到或可以用來繪圖的部分。它可以和視窗等大,也可以比視窗大或者小。一般設定視口等於視窗,只有繪製在視口區域中的圖形才能被顯示,如果圖形有一部分超出了視口區域,那麼那一部分是看不到的。通過glViewport()函式設定。在本程式中,設定視口區域大小等於視窗區域大小。
定義視口的函式是void glViewport(Glint x,GLint y,GLsizei width,GLsizei height);其中x是指視口開始位置距離視窗左邊的距離(以畫素計),y是視口開始位置距離視窗底邊的距離(以畫素計),width視口的寬度(以畫素計),height視口的高度(以畫素計)。
X,Y引數指定了視窗內部視口的左下角,width與height引數指定了視口的大小

設定裁剪區域

    //重置座標系統
    glMatrixMode(GL_PROJECTION);            //切換為透視投影矩陣
    glLoadIdentity();                       //將透視投影矩陣轉換為單位矩陣
    // 建立裁剪區域(左、右、底、頂、近、遠)
    aspectRatio = (GLfloat)w / (GLfloat)h;
    if(w <= h)
    {
        glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);
    }
    else
    {
        glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
    }
    glMatrixMode(GL_MODELVIEW);             //切換為平行投影矩陣
    glLoadIdentity();                       //將平行投影矩陣轉換為單位矩陣

一般會保證與視窗的縱橫比是一致的,所以得設定一個變數aspectRatio。

裁剪區域:裁剪區就是我們畫圖是所用的邏輯區域,他用的是邏輯座標,即在視口中讓你看到的圖形,即顯示出來的那部分。就是視口矩形區域的最小最大x座標(left,right)和最小最大y座標(bottom,top),而不是視窗的最小最大x座標和y座標。通過glOrtho()函式設定,這個函式還需指定最近最遠z座標,形成一個立體的裁剪區域。