You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

程序启动时三角形显示位置异常,调整窗口后恢复的修复方法

解决OpenGL程序启动时三角形位置偏移问题

这个问题在macOS的GLUT环境下挺常见的——程序刚启动时三角形位置不对,调整窗口大小就恢复正常,核心原因是初始状态下ChangeSize函数没被自动调用,导致OpenGL的视口(viewport)没有和你设置的窗口尺寸匹配。

问题根源

当你用glutCreateWindow创建窗口后,macOS上的GLUT并不会自动触发glutReshapeFunc绑定的ChangeSize函数。而OpenGL默认的视口可能不是你设定的800x600,这就导致你的标准化设备坐标(顶点数据里的-0.5、0.5这些值)没有正确映射到窗口空间,所以三角形位置跑偏了。调整窗口大小时,ChangeSize会被触发,视口被正确设置,位置就恢复正常了。

修复方案

最简单的办法就是在程序初始化完成后,手动调用一次ChangeSize函数,传入你设置的初始窗口尺寸。修改你的main函数即可:

int main(int argc, char* argv[]) {
    gltSetWorkingDirectory(argv[0]);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }
    
    SetupRC();
    // 手动调用ChangeSize,传入初始窗口尺寸
    ChangeSize(800, 600);
    glutMainLoop();
    return 0;
}

灵活优化方案

如果你担心硬编码窗口尺寸不够灵活,也可以用glutGet获取当前窗口的实际大小再调用,这样后续修改初始窗口尺寸时不用同步改这个数值:

// 替换上面的ChangeSize(800,600)
int w = glutGet(GLUT_WINDOW_WIDTH);
int h = glutGet(GLUT_WINDOW_HEIGHT);
ChangeSize(w, h);

这个修改能确保程序启动时就正确设置了视口,让你的三角形顶点坐标能正确映射到窗口空间,启动时就能显示在预期位置啦。

内容的提问来源于stack exchange,提问作者VenomOverflow

火山引擎 最新活动