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