glViewport

#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

自然缩短一半


你可能感兴趣的:(OpenGL)