#include <gl/glut.h>
// 函数RenderScene用于在窗口中绘制需要的图形
void RenderScene(void)
{
//用当前清除色清除颜色缓冲区,即设定窗口的背景色
glClear(GL_COLOR_BUFFER_BIT);
//设置当前绘图使用的RGB颜色
glColor3f(1.0f, 0.0f, 0.0f);
//使用当前颜色绘制一个填充的矩形
glRectf(100.0f, 150.0f, 150.0f, 100.0f);
//刷新OpenGL命令队列
glFlush();
}
// 函数ChangeSize是窗口大小改变时调用的登记函数
void ChangeSize(GLsizei w, GLsizei h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, 250.0f, 0.0f, 250.0f);
}
//函数SetupRC用于初始化,常用来设置场景渲染状态
void init(void)
{
// 设置窗口的清除色为白色
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void main(void)
{
//初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
// 创建一个名为GLRect的窗口
glutCreateWindow("GLRect");
// 设置当前窗口的显示回调函数和窗口再整形回调函数
init();
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
//启动主GLUT事件处理循环
glutMainLoop();
}
其实在你没有写reshape函数的时候,系统自动调用了默认的reshape函数,使适口随着window size的调整而发生变化,二glOtho函数的参数是不变的。
这样的话就会发现虽然在glOthro当中长宽比是一样的,但是在视口中不一样,则单位窗口(glOthro)的长度就不一样了,原来等长的长与宽就不一样长了
于是发生了形变。
当你自己书写了reshape函数之后,系统默认的glViewport函数的参数是window size的原始窗口大小,是固定不变的,于是乎就不发生形变了
只要glOthro和glViewport的参数比例相同,在窗口window size 拉伸的时候不发生比例失调
物体的长宽比就是一样的 于是乎下面的数据就是这样的
#include <gl/glut.h>
// 函数RenderScene用于在窗口中绘制需要的图形
void RenderScene(void)
{
//用当前清除色清除颜色缓冲区,即设定窗口的背景色
glClear(GL_COLOR_BUFFER_BIT);
//设置当前绘图使用的RGB颜色
glColor3f(1.0f, 0.0f, 0.0f);
//使用当前颜色绘制一个填充的矩形
glRectf(100.0f, 150.0f, 150.0f, 100.0f);
//刷新OpenGL命令队列
glFlush();
}
// 函数ChangeSize是窗口大小改变时调用的登记函数
void ChangeSize(GLsizei w, GLsizei h)
{
if(h == 0) h = 1;
//设置视区尺寸
glViewport(0, 0, w, h);
// 重置坐标系统,使投影变换复位
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 建立修剪空间的范围
if (w <= h)
glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0f, -1.0f);
else
glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0f, -1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//函数SetupRC用于初始化,常用来设置场景渲染状态
void init(void)
{
// 设置窗口的清除色为白色
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void main(void)
{
//初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
// 创建一个名为GLRect的窗口
glutCreateWindow("GLRect");
// 设置当前窗口的显示回调函数和窗口再整形回调函数
init();
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
//启动主GLUT事件处理循环
glutMainLoop();
}
下面解释下面这个程序发生的形变
#include <gl/glut.h>
// 函数RenderScene用于在窗口中绘制需要的图形
void RenderScene(void)
{
//用当前清除色清除颜色缓冲区,即设定窗口的背景色
glClear(GL_COLOR_BUFFER_BIT);
//设置当前绘图使用的RGB颜色
glColor3f(1.0f, 0.0f, 0.0f);
//使用当前颜色绘制一个填充的矩形
glRectf(100.0f, 150.0f, 150.0f, 100.0f);
//刷新OpenGL命令队列
glFlush();
}
// 函数ChangeSize是窗口大小改变时调用的登记函数
void ChangeSize(GLsizei w, GLsizei h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0f, -1.0f);
else
glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0f, -1.0f);
}
//函数SetupRC用于初始化,常用来设置场景渲染状态
void init(void)
{
// 设置窗口的清除色为白色
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void main(void)
{
//初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
// 创建一个名为GLRect的窗口
glutCreateWindow("GLRect");
// 设置当前窗口的显示回调函数和窗口再整形回调函数
init();
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
//启动主GLUT事件处理循环
glutMainLoop();
}
这个程序在窗口window size 发生变化的时候会发生形变 并且是图形长度比例的相应缩小
因为没有使用glVieport 所以默认长宽是原来的长宽
而视口glOthro发生了相应的改变则会同比例的缩小相应的边
比如
400------400
400-----400
不发生形变
400-------400
400-------800
自然缩短一半