我使用GLFW3将我的一个游戏从Windows移植到Linux用于创建窗口。当我在Windows中运行它时(使用GLFW3和opengl),代码运行得非常好,但是当我在ubuntu 12.10中编译并运行它时,在全屏模式下(在窗口模式下它运行良好)存在问题,其中正确的部分(大约25帧的%)被拉伸并离开屏幕。 以下是我创建GLFW窗口的方法:
window = glfwCreateWindow(1024, 768, "Chaos Shell", glfwGetPrimaryMonitor(), NULL);
这是我的opengl初始化代码:
glViewport(0, 0, 1024, 768);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-512.0f, 512.0f, -384.0f, 384.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
以上代码应以1024 x 768分辨率在全屏模式下加载游戏。 当我运行它时,glfwCreateWindow将屏幕分辨率从我当前的屏幕分辨率(1366乘768)更改为1024乘768,但帧的右侧部分会关闭屏幕。如果我手动将分辨率更改为1024乘768然后运行游戏,一切看起来都不错。 此外,无论我当前的屏幕分辨率是什么,在Windows中运行相同的代码都不会显示任何问题。它只是将分辨率更改为1024乘768,然后一切看起来都很完美。 如果有人能够找到为什么它在ubuntu中表现得很奇怪,那么我真的很感激......
答案 0 :(得分:2)
您可能遇到了窗口管理器的问题。简而言之,窗口管理器没有注意到分辨率变化的变化,并且由于全屏标记将窗口扩展为旧分辨率。
或者你根本没有获得1024×768,因为你的屏幕不支持它,而是获得了更小的16:9分辨率。因此,请勿使用硬编码值来设置视口。
老实说:你根本不应该改变屏幕分辨率!几乎没有人使用CRT显示器。对于使用离散像素(LCD,AMOLED,DLP投影仪,LCoS投影仪)的显示器,在除原始分辨率之外的任何其他区域运行它们都没有意义。因此,只需创建一个全屏窗口,而不会让系统更改分辨率。
从GLFW设置视口查询实际窗口大小时,而不是依赖于您的硬编码值(这实际上也可以通过更改分辨率来解决您的问题)。
如果要在渲染时减少GPU上的负载:使用FBO渲染到所需分辨率的纹理,并在最后一步中将该纹理绘制为全屏四边形,以将其拉伸到显示大小。它看起来比大多数屏幕缩放器产生的要好,而且你的游戏不会弄乱系统的其他部分。
设置屏幕分辨率以响应游戏无法应对非4:3分辨率的风格非常糟糕。大型游戏工作室花了很长时间才能采用宽屏幕。这是不可接受的,因为它很容易修复。
不要在他可能不想要的用户身上施加某些事情来掩盖错误。如果用户有一个漂亮的显示器让他有机会实际使用它!
您的问题不是显示分辨率。这是硬编码的视口和投影设置。你需要解决这个问题。
要修复“游戏在不同分辨率下看起来很糟糕”的问题,您需要设置视口和投影以响应窗口的大小。像这样:
int window_width, window_height;
glfwGetWindowSize(&window_width, &window_height);
if( 0 == window_width
|| 0 == window_height) {
/* window has no area, so there's nothing to draw to */
return;
}
float const window_aspect = (float)window_width / (float)window_height;
/* we want to draw with a total of 768 units vertically as if we
* were drawing to a screen 768 pixels in height. */
float const projection_scale = 768./2;
glViewport(0, 0, window_width, window_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( -aspect * projection_scale,
aspect * projection_scale,
-projection_scale,
projection_scale,
0.0f,
1.0f );