您的位置:首页 > 运维架构

【学习OpenGL】(二)——绘制矩形(视口与裁剪区)

2018-02-07 15:42 483 查看

绘制矩形

在前面第一个创建窗口的程序的基础之上,添加绘制矩形的函数

#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坐标,形成一个立体的裁剪区域。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息