Linux中的C ++ GLFW3全屏拉伸问题

Pradipna尼泊尔

我正在使用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 x 768)更改为1024 x 768,但是框架的右部分不在屏幕上。如果我手动将分辨率由768更改为1024,然后运行游戏,一切似乎都很好。另外,无论我当前的屏幕分辨率是多少,在Windows中运行相同的代码都不会显示任何问题。它只是将分辨率由768更改为1024,然后一切看起来都很完美。如果有人能找到为什么它在ubuntu中表现怪异的话,那么我将不胜感激...

数据狼

您可能会遇到窗口管理器的问题。简而言之,窗口管理器没有注意到分辨率的变化,并且由于全屏标志将窗口扩展到了旧的分辨率。

或者您根本没有得到1024×768,因为您的屏幕不支持它,而是获得了一个较小的16:9分辨率。因此,请勿使用硬编码的值来设置视口。

老实说:您根本不应该更改屏幕分辨率!几乎没有人使用CRT显示器了。对于使用离散像素的显示器(LCD,AMOLED,DLP投影仪,LCoS投影仪),以除原始分辨率以外的任何其他条件运行它们几乎没有意义。因此,只需创建一个全屏窗口,而无需使系统更改分辨率。

设置视口时,从GLFW查询实际窗口大小,而不是依赖于您的硬编码值(这实际上也可以解决分辨率更改的问题)。

如果要减少渲染时GPU上的负载,请执行以下操作:使用FBO渲染为所需分辨率的纹理,并在最后一步中将该纹理绘制到全屏四边形,以将其拉伸到显示尺寸。它看起来比大多数屏幕缩放器所产生的效果要好,并且您的游戏不会与系统的其余部分混为一谈。

由于评论而更新

设置屏幕分辨率以响应游戏无法应对非4:3分辨率是非常糟糕的风格。大型游戏工作室花了很长时间才采用宽屏幕。这是不可接受的,因为它很容易修复。

不要通过强迫用户不要的东西来掩盖错误。如果用户的显示效果不错,请给他机会实际使用它!

您的问题不是显示分辨率。这是硬编码的视口和投影设置。您需要解决该问题。

要解决“游戏在不同分辨率下看起来很恐怖”的问题,您需要根据窗口的大小设置视口和投影。像这样:

int window_width, window_height;
glfwGetWindowSize(window, &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 );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章