我的OpenGL游戏会关闭Aero DWM Glass

3
我几年前写了一个免费游戏: http://www.walkover.org。对于大厅和菜单,它使用类似win32的普通对话框。当实际游戏开始时,它使用OpenGL。
现在,在Windows 7上,当实际游戏开始时,它会关闭窗口aero玻璃,并在游戏结束时重新打开。
有什么办法可以防止这种情况发生吗?是否有一些特殊标志可以保持玻璃状态?(对于更新的版本,我一直在使用DirectX,这种情况不会发生。)也许我需要在某个地方指定(新的)标志?
我正在使用这个pixelformatdescriptor:
    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
        1,                              // version number
        PFD_DRAW_TO_WINDOW |            // support window
          PFD_SUPPORT_OPENGL |          // support OpenGL
          PFD_DOUBLEBUFFER,             // double buffered
        PFD_TYPE_RGBA,                  // RGBA type
        32,                             // 24-bit color depth
        0, 0, 0, 0, 0, 0,               // color bits ignored
        0,                              // no alpha buffer
        0,                              // shift bit ignored
        0,                              // no accumulation buffer
        0, 0, 0, 0,                     // accum bits ignored
        0,                              // 32-bit z-buffer
        0,                              // no stencil buffer
        0,                              // no auxiliary buffer
        PFD_MAIN_PLANE,                 // main layer
        0,                              // reserved
        0, 0, 0                         // layer masks ignored
    };

这是一个全屏或窗口应用程序?对于全屏应用程序,您不必太在意,对于窗口应用程序,DirectX 表现不同的原因是 DWM 本身使用 DirectX 而不是 OpenGL。 - Ben Voigt
它是全屏的,但不需要高性能硬件。所以如果将其切换为窗口应用程序可以解决问题。但我不知道如何做。 顺便说一下,我发现了这个网站:http://encelo.netsons.org/programming/opengl 上面有一些OpenGL示例。它们来自2005年,是窗口模式,16位,但DWM保持开启。然而,它们使用SDL来初始化OpenGL表面。 :/ - marc40000
4个回答

5
这个问题的原因如下:
  • Windows 7
  • OpenGL
  • 创建和您屏幕大小完全匹配的窗口(全屏)
  • 第二次调用Swap Buffers
  • 旧的显卡驱动程序
我有同样的问题,并测试了使用OpenGL的两个AAA游戏引擎,可以确认它们都有同样的问题。DirectX似乎不受影响。
这意味着您的窗口创建是正确的,不是代码问题。
建议更新您的显卡驱动程序以解决问题。
我找到了一个短期解决方法,即创建一个比您屏幕分辨率更大1像素的窗口(在宽度或高度上)。
这会欺骗Windows,使其不会检测到您已经进入全屏模式,也不会触发此问题。

1

我认为这可能是因为您创建了一个与Aero Glass不兼容的OpenGL渲染上下文。如果我没记错,其中一种可能导致此问题的情况是使用16位颜色创建窗口。Aero Glass无法在16位颜色下进行渲染,因此由于某些技术原因,Windows必须完全禁用Aero Glass(即使只有您的应用程序在使用它)。尝试使用32位颜色。

还可能有其他设置出于类似原因禁用它。简而言之,请仔细检查您使用OpenGL创建的所有设置,并思考“如果桌面切换到此模式,Aero Glass会关闭吗?”


哈哈,好吧。那个游戏太老了,我完全忘记我在16位中初始化OpenGL了。你是对的,那可能是原因。我会尝试修改并回报结果。 - marc40000
我把16位改成32或24位了,但效果仍然一样。这通常不可能吗?我在问题中添加了我使用的Pixelformatdescriptor。 - marc40000

0

不确定你具体做了什么导致这个问题,但这可能是好事——说得好听点,微软在Windows 7中的OpenGL实现并不完美。事实上,在我的大部分OpenGL代码中,我已经明确关闭了DWM。否则,微软实现中的错误基本上会使其完全无法工作。虽然我可以通过其他方式在某种程度上解决这个问题,但性能非常差,使代码基本上无法使用(我没有进行严格的测量,但立即猜测至少有5:1的性能损失)。


0

我曾经在我的应用程序中遇到一个问题,当尝试从窗口 DC 中进行位块传输时,GDI 无法读取 OpenGL 渲染的窗口内容。那是在 Vista 刚刚推出的时候。使用 PFD_SUPPORT_GDI 可以解决这个问题,但同时也会禁用 Aero。我猜这个问题导致了很多旧应用程序崩溃,所以在某些情况下他们被强制启用。不确定你的情况是什么。我想可能是驱动程序存根的问题。

这只是我对 OpenGL、Aero 和 GDI 的有限经验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接