#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
自然缩短一半