【學習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座標,形成一個立體的裁剪區域。