在Windows之间切换后无效的OpenGL绘图上下文

时间:2015-05-04 13:31:49

标签: c++ opengl

我在OpenGL应用程序'A'(用C ++编写)中遇到以下问题: 在切换到不同的窗口'B'(相同应用程序的子窗口或完全不同的应用程序)然后切换回'A'之后,所有OpenGL渲染都被限制在'A'区域内。 B”。

  • 在最小化并重新最大化窗口'A'
  • 之后,问题就消失了
  • 问题只发生在一台Windows 7机器上。在许多其他机器(Windows和Linux)上进行测试时,一切正常。将图形驱动程序更新到最新版本也无济于事。

是否存在导致此行为的明显编码错误?

调试此类错误的好方法是什么?

1 个答案:

答案 0 :(得分:3)

有许多方面可能会影响Windows上的重绘行为。鉴于问题中的细节很少,我建议先查看基础知识:

  • 首先,在Windows上,您需要使用以下标志创建OpenGL上下文窗口:WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN

  • 在回复WM_ACTIVATE时,您应该致电wglMakeCurrent()

  • 在回复WM_SIZE时,您应该致电glViewport()

行为肯定会因硬件,Windows版本和驱动程序版本而异。所有组合都有自己的怪癖。

  

在最小化并重新最大化窗口A'

之后问题就消失了

这迫使重绘调整大小,因此不会非常缩小问题的范围。对于调试,您可以使用WM_CHAR来获取键盘事件,并使用热键强制重新绘制(没有所有其他消息流)。这会告诉你它是否是一个激活问题。

  

...所有OpenGL渲染都局限于' A'这是由' B'。

所涵盖的

如果渲染缩小到重叠区域,则视口可能会混乱,例如在重绘期间将视口设置为脏矩形。

如果缩放是正确的,但您只是看到窗口的一角正在重新绘制,那么您所看到的行为是遮挡窗口保存窗口的后备缓冲区,后者在恢复时仅重新绘制已保存的位。这显然不足以重新绘制逻辑,剪辑标志会影响此行为。

另一种可能性是,在处理重绘事件之前,活动的GL上下文(每个线程只有一个)没有切换到新激活的窗口。上面的激活处理将解决这个问题。

至于调试策略,我在您的事件处理程序(或使用MessageSpy)中添加了一些printf,以便您可以看到事件的顺序。事实上,它只是硬件和软件的特定组合,这意味着您可能依赖于版本之间略有不同的默认行为。您可以提供的任何更多细节将有助于进一步缩小范围。