使用glutReshapeFunc更改窗口大小时显示错误

时间:2018-09-21 00:35:32

标签: opengl

我知道glutReshapeFunc可用于调整窗口大小,因此我用它来重置投影矩阵并渲染形状以匹配窗口。代码如下:

#include <GLUT/glut.h>

GLsizei wndWidth = 400;
GLsizei wndHeight = 300;

void init() {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 400, 0, 300);
}

void drawSegment() {
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0, 0, 1.0);

    glBegin(GL_LINE_LOOP);
    glVertex2i(10, 10);
    glVertex2i(wndWidth-10, wndHeight-10);
    glVertex2i(wndWidth-10, 10);
    glEnd();

    glFlush();
}

void reshapeFunc(int width, int height) {


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, GLdouble(width), 0, GLdouble(height));

    glClear(GL_COLOR_BUFFER_BIT);

    wndWidth = width;
    wndHeight = height;
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

    glutInitWindowSize(400, 300);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Draw Window");

    init();
    glutDisplayFunc(drawSegment);
    glutReshapeFunc(reshapeFunc);

    glutMainLoop();
}

我认为,在调整窗口大小之后,三角形应始终占据窗口的一半。但是实际上,三角形在窗口调整大小后仍保持其大小,好像wndWidthwndHeightdrawSegment中没有变化。 那么,为什么我得到错误的结果以及如何解决呢?

1 个答案:

答案 0 :(得分:1)

投影矩阵将视图坐标转换为剪辑坐标,并将剪辑坐标转换为规范化的设备坐标(在正交投影中,剪辑坐标和规范化的设备坐标相等)。
glViewport指定如何将规范化的设备坐标映射到窗口坐标。
更改窗口大小后,您必须重新指定映射:

void reshapeFunc(int width, int height) {

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, GLdouble(width), 0, GLdouble(height));

    wndWidth = width;
    wndHeight = height;
}