OpenGL在窗口调整大小

时间:2018-05-14 11:22:07

标签: c++ opengl orthographic

我有一个正方形,我试图让它在调整窗口大小时保持正方形,而不是用窗口拉伸。我有一些我认为可行的代码,但是当我调整窗口大小时,方块缩小并消失。当我将窗口恢复到原始大小时,它不会回来。有人能告诉我我做错了什么以及如何解决它?

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    glFlush();
    return;
}

void reshape(int w, int h) {
    const float aspectRatio = ((float)w) / h;
    float xSpan = 1;
    float ySpan = 1;

    if (aspectRatio > 1) {
        xSpan *= aspectRatio;
    }
    else {
        ySpan *= aspectRatio;
    }

    gluOrtho2D(-1*xSpan, xSpan, -1*ySpan, ySpan);
    glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("simple");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
}

1 个答案:

答案 0 :(得分:1)

函数gluOrtho2DglOrtho将当前矩阵乘以新的正交投影矩阵。
这导致如果gluOrtho2D被第二次调用,之前由glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-1*xSpan, xSpan, -1*ySpan, ySpan); 设置的矩阵乘以新的矩阵,您将获得连续的变化。

您必须通过glLoadIdentity“重置”矩阵堆栈上的矩阵(初始化标识矩阵)。此外,您应该按glMatrixMode选择投影矩阵堆栈:

gluOrtho2D

视口glViewport的设置是正确的,您还可以正确考虑宽高比(在ySpan /= aspectRatio;中)。但如果纵横比小于1.0则存在问题。它应该是display

我建议在reshape函数中设置视口和投影矩阵,只是在bool vp_valid = true; int width, height; void reshape(int w, int h) { vp_valid = false; width = w; height = h; } void display(void) { if (!vp_valid) { const float aspectRatio = (float)width / height; float sx = aspectRatio > 1.0f ? aspectRatio : 1.0f; float sy = aspectRatio > 1.0f ? 1.0f : 1.0f/aspectRatio; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-sx, sx, -sy, sy); glViewport(0, 0, width, height); } ..... } 函数中设置通知标志。请注意,视口和投影矩阵应尽可能少地更改。

totalmorango