3

我在使用全屏模式时遇到了一些问题。我可以将我的窗口设置为 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);
}
4

2 回答 2

5

解决方案: 真正的问题最终是您误用了 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); 
于 2012-06-05T05:28:42.470 回答
3

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

于 2012-06-05T05:32:04.453 回答