OpenGL与全屏原始分辨率撕裂

我有一个OpenGL的应用程序与Win32 API没有过剩等…我遇到了全屏幕撕裂的问题。 基本上,我已经将WS_POPUP设置为一个窗口样式,并将我的显示器的分辨率设置为窗口大小。 我在AMD radeon HD 7770上运行,我看到可怕的撕裂! 当我把WS_POPUPWINDOW样式,而不是WS_POPUP ,撕裂已经消失,但我有我的场景不需要的边框。 另一件我注意到的事实是,当分辨率不是本机时,撕裂消失。 所以当我通过my_screen_resolution + 1作为大小参数,撕裂已经消失。

 RESx = 1920; RESy = 1080; hwnd = CreateWindowEx(NULL, NAME, NAME, WS_POPUP, 0, 0, RESx, RESy, NULL, NULL, hInstance, NULL); SetWindowPos(hwnd, 0, -1, -1, RESx + 1, RESy + 1, 0); // With this function call, the tearing disappears! 

我可以做什么来摆脱撕裂,而不必运行不原始分辨率?

编辑:(提示:这不是V-sync)

我可以做什么来摆脱撕裂,而不必运行不原始分辨率?

编辑:(提示:这不是V-sync)

是的,它是V-Sync。

当您制作全屏窗口时,将绕过DWM合成器。

如果窗口未覆盖整个屏幕,则其内容将通过DWM合成器。 DWM合成器本身使得它自己成为窗口内容的副本,只要有东西指出它已经完成绘制(从WM_PAINT处理程序,EndPaint或SwapBuffers调用返回)。 构图本身发生V-synced。

感谢您的建议,但我想避免vsync的撕裂。 与vsync我有可怕的输入滞后。

那么你在输入处理中做错了什么。 很可能您的事件循环一次只处理一个输入事件,然后重绘。 如果是这样的话,你的场景复杂度就会上升,那么你就会越来越滞后,这与你场景的绘制复杂度成正比。 你不想要这样的事情发生。

你应该做的是积累所有的输入事件堆积之间的重绘,并将其合并成一个新的绘图状态。 理想情况下,输入事件被收集,直到仅仅在场景被设置用于绘制以反映最近的状态之前。 如果你想得到喜欢你,我添加一个卡尔曼滤波器来预测输入状态,在框架显示给用户,并用它来绘制场景。

要删除OpenGL撕裂,你应该有“启用”vsync。 请点击此链接了解详细信息: 如何在opengl中启用垂直同步?