我在全屏模式下遇到了一些麻烦。我可以将窗口设置为800x600,但是当我全屏显示该分辨率时,它就会拉伸(stretch)。我认为这是由于宽高比的变化。我怎样才能解决这个问题?

编辑#1

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

opengl - OpenGL中的宽高比拉伸(stretch)-LMLPHP

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

最佳答案

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

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

您需要将其切换为正确的格式:
gluOrtho2D(0.0, width, 0.0, height);

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

原始答案:

您需要修改投影以考虑新的宽高比。

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

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

10-08 08:21