我在全屏模式下遇到了一些麻烦。我可以将窗口设置为800x600,但是当我全屏显示该分辨率时,它就会拉伸(stretch)。我认为这是由于宽高比的变化。我怎样才能解决这个问题?
编辑#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);
}
最佳答案
解决方案:
真正的问题最终是您滥用了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);