OpenGL中的宽高比拉伸

时间:2012-06-05 05:19:23

标签: opengl aspect-ratio

我在全屏模式下遇到了一些麻烦。我可以将窗口设置为800x600,但是当我全屏显示该分辨率时,它会延伸。我认为这是因为宽高比的变化。我该如何解决这个问题?

编辑#1

这是我看到的事情的屏幕截图。

image

左: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);
}

2 个答案:

答案 0 :(得分:4)

<强>解: 真正的问题最终是你误用了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); 

答案 1 :(得分:2)

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