glViewport

3702 ワード

#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
自然を半分に縮める