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

Opengl 使用GLUTEFUNC更改窗口大小时显示错误,opengl,Opengl,我知道可以使用glutreformefunc对窗口大小进行调整,因此我使用它重置投影矩阵并渲染形状以匹配窗口。代码如下: #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();

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

#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();
}
#包括
GLsizei wndWidth=400;
GLsizei wndHeight=300;
void init(){
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0400,0300);
}
无效段(){
glClear(GLU颜色缓冲位);
GL3F(0,0,1.0);
glBegin(GL_线_环);
glVertex2i(10,10);
glVertex2i(wndWidth-10,wndHeight-10);
glVertex2i(wndWidth-10,10);
格伦德();
glFlush();
}
空心形状(整型宽度、整型高度){
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0,GLdouble(宽度),0,GLdouble(高度));
glClear(GLU颜色缓冲位);
wndWidth=宽度;
WndHight=高度;
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400300);
glutInitWindowPosition(0,0);
创建窗口(“绘制窗口”);
init();
glutDisplayFunc(绘图段);
GLUTEFUNC(重塑EFUNC);
glutMainLoop();
}
在我看来,调整窗口大小后,三角形应始终占据窗口的一半。但事实上,调整窗口大小后三角形仍保持其大小,就好像
wndWidth
wndHeight
drawSegment
中没有改变一样。
那么,为什么我会得到错误的结果以及如何修复它呢?

投影矩阵将视图坐标转换为剪辑坐标,剪辑坐标转换为标准化设备坐标(在正交投影条件下,剪辑坐标和标准化设备坐标相等)。
规范化设备坐标映射到窗口坐标的方式由指定。
更改窗口大小后,必须重新指定映射:

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;
}