我在全屏模式下遇到了一些麻烦。我可以将窗口设置为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);
}
答案 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(假设您希望图像的水平展宽与其相同)是在原来的窗口)。