You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL GLUT窗口每次调整大小后内容逐次拉伸变形问题求助

窗口拉伸逐次变形问题修复

问题根因

变形逐次累积的核心原因是投影矩阵设置前未做重置:OpenGL固定管线的矩阵操作是乘法累加逻辑,gluOrtho2D不会直接替换当前投影矩阵,而是将新生成的正交投影矩阵与当前矩阵栈顶的原有矩阵相乘后,再作为新的栈顶矩阵。

  • 应用初始启动时,投影矩阵默认为单位矩阵,首次设置正交投影参数计算结果正确,对应启动后无拉伸的正常状态
  • 第一次触发窗口resize回调时,未清空上次留存的投影矩阵就直接调用gluOrtho2D,生成的投影矩阵已经出现偏差
  • 后续每次resize都会在已经出错的矩阵基础上继续叠加新的变换,变形会逐次加重,和你观察到的调整一次窗口后每次拉伸都更明显的现象完全吻合

修复代码

只需要在切换到投影矩阵模式后,先调用glLoadIdentity()将矩阵重置为单位矩阵,再设置正交投影参数即可,修复后的resize回调代码如下:

void resizeCallback(int w, int h) {
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    // 关键修复:重置投影矩阵,避免历史变换累加
    glLoadIdentity();

    const GLfloat aspectRatio = (GLfloat)w / (GLfloat)h;
    gluOrtho2D(-aspectRatio, aspectRatio, -1.0f, 1.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

注意事项

使用OpenGL固定管线做矩阵操作时,只要需要设置全新的矩阵状态(比如切换投影类型、重置模型视角),都要先调用glLoadIdentity()清空当前栈顶的旧矩阵,否则新旧变换叠加必然会出现渲染位置错误、图形变形这类问题。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:03:30