窗口重定形函数

当我们改变屏幕尺寸或是第一次生成屏幕时,我们就需要用到窗口重定形函数,来重新绘制一些图形。

注意glLoadIdentity()函数,它可以保证屏幕的改变不会对原来的绘制有影响。然而若想做到例如保持长宽比不变、或者一直居中等,仍需要进行其它的操作。

#include<Windows.h>
#include<GL/glut.h>
#include<cmath>

const double PI = acos(-1.0);
GLuint regHex;

void setupList()
{
    regHex = glGenLists(1);
    glNewList(regHex, GL_COMPILE);
    {
        glBegin(GL_POLYGON);
        {
            for (int i = 0; i < 6; ++i)
            {
                double theta = PI * i / 3.0;
                int x = 400 + 150 * cos(theta);
                int y = 300 + 150 * sin(theta);
                glVertex2i(x, y);
            }
        }
        glEnd();
    }
    glEndList();
}

//当屏幕的宽或高发生变化时(包括初始化)调用
void reshape(int w, int h)
{
    glMatrixMode(GL_PROJECTION);

    //使得之前的投影参数值对新的投影设置不起作用
    glLoadIdentity();

    gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
    glClear(GL_COLOR_BUFFER_BIT);

}

void display()
{
    glColor3d(1.0, 0.0, 0.0);
    glCallList(regHex);
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Reshape");
    setupList();
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutMainLoop();
}