【问题标题】:Aspect Ratio Stretching in OpenGLOpenGL中的纵横比拉伸
【发布时间】:2012-06-12 12:06:49
【问题描述】:

我在使用全屏模式时遇到了一些问题。我可以将我的窗口设置为 800x600,但是当我全屏显示该分辨率时,它会拉伸。我认为这是因为纵横比发生了变化。我该如何解决这个问题?

编辑#1

这是我看到的屏幕截图。

左:800x600

右:1366x768

编辑#2

每次我重新调整窗口大小 (WM_SIZE) 时都会调用我的 initGraphics 函数。

void initGraphics(int width, int height) {
    float aspect = (float)width / (float)height;
    glViewport(0, 0, width, height);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND); //Enable alpha blending
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, width, height * aspect, 0.0);
    glMatrixMode(GL_MODELVIEW);
}

【问题讨论】:

  • 你的投影矩阵是什么样的?

标签: opengl aspect-ratio


【解决方案1】:

解决方案: 真正的问题最终是您滥用了 gluOrtho2D 函数。而不是使用这个:

gluOrtho2D(0.0, width, height * aspect, 0.0);

您需要将其切换为正确的形式:

gluOrtho2D(0.0, width, 0.0, height);

后者会创建一个 2D 正交投影,填充视口的整个宽度和高度,因此不会发生拉伸。

原始答案:

您需要修改投影以适应新的纵横比。

确保首先将glViewport 设置为新的窗口大小。设置好视口后,您需要通过调用glMatrixMode 将矩阵模式切换为投影,最后使用width / height 计算新的纵横比并将新的纵横比传递给gluPerspective。你也可以直接使用glFrustum 而不是gluPerspective 你可以找到gluPerspective 的源代码来达到与glFrustum 相同的效果。

类似这样的:

    float aspectRatio = width / height;
    glMatrixMode(GL_PROJECTION_MATRIX);
    glLoadIdentity();
    gluPerspective(fov, aspectRatio, near, far); 

【讨论】:

  • 不要忘记glLoadIdentity(),否则投影矩阵可能会将视角叠加在一起
  • 我使用的是Ortho,但过程相同。
  • @JustinMeiners 但为什么我要拉伸?这正常吗?我是新手,所以我不知道我应该在这里寻找什么,但似乎拉伸会很糟糕。
  • @Storm Kiernan 不,这不正常,您确定在调整窗口大小时调用 glOrtho 吗?
【解决方案2】:

调整窗口大小后,您需要调整投影矩阵以反映新的纵横比。如果您使用的是经典 OpenGL,请将矩阵模式切换为 GL_PROJECTION,加载单位矩阵,然后调用 glOrtho 或 gluPerspective 并使用按纵横比缩放的垂直尺寸(假设您希望图像的水平扩展与它相同与原始窗口一起使用)。

【讨论】:

  • 我正在这样做,但我没有看到任何结果。 gluOrtho2D(0.0, width, height * (width / height), 0.0);
  • 只是猜测——高度和宽度是整数吗?您可能希望在计算该分数之前将一个或两个都转换为双精度数,否则您最终可能会乘以 1。
  • 没有区别。图像只是在窗口大小的任何方向上拉伸。
  • 我更新了我的原始帖子以显示我看到的情况的屏幕截图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2014-07-02
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多