我在OpenGL应用程序'A'(用C ++编写)中遇到以下问题: 在切换到不同的窗口'B'(相同应用程序的子窗口或完全不同的应用程序)然后切换回'A'之后,所有OpenGL渲染都被限制在'A'区域内。 B”。
是否存在导致此行为的明显编码错误?
调试此类错误的好方法是什么?
答案 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
,以便您可以看到事件的顺序。事实上,它只是硬件和软件的特定组合,这意味着您可能依赖于版本之间略有不同的默认行为。您可以提供的任何更多细节将有助于进一步缩小范围。