如何使用 OpenGL + GLFW 防止屏幕撕裂?

Lam*_*bda 6 c++ windows opengl vsync glfw

我正在开发一个支持多个操作系统和图形后端的图形应用程序。该窗口是使用 GLFW 创建的,并且图形 API 在运行时选择。当在 Windows 上运行程序并使用 OpenGL 时,Vsync 似乎被破坏了。帧速率锁定在 60 fps,但出现屏幕撕裂伪影。根据 GLFW 文档,glfwSwapInterval(0);应该解锁使用 VSync 的默认帧速率。这按预期工作。使用glfwSwapInterval(1);时应锁定帧速率以匹配显示器的刷新率。根本不调用glfwSwapInterval();应该默认使用垂直同步。虽然使用这些调用正确锁定/解锁了帧速率,但我经历了非常有趣的行为。

glfwSwapInterval();根本不调用时,垂直同步设置为默认值。但是等待下一帧发生在第一次绘制调用时!人们会认为下一帧的延迟会发生在glfwSwapBuffers()。无论如何都看不到屏幕伪像。

调用时glfwSwapInterval(1);,Vsync 被设置,下一帧的延迟发生在glfwSwapBuffers()!这很好,但是,当显式设置垂直同步时,会出现屏幕撕裂现象。

现在,不要求glfwSwapInterval()使用 VSync 似乎是一个很棘手的解决方案,但是:

  • 如果不重建窗口,用户将无法禁用垂直同步,
  • 探查器发现第一个绘制调用花费的时间太长,因为 VSync 等待时间以某种方式发生在那里。

我尝试摆弄 GPU 驱动程序设置并在多台机器上测试代码。如果使用 Windows 和 OpenGL,该问题在不同机器上仍然存在。

如果有人能理解这一点,请分享,或者如果我误解了某些东西,我将非常感谢一些正确方向的指示。

编辑:其他一些细节:撕裂发生在特定的水平线上。框架的其余部分似乎工作正常。

经过更多测试后,似乎一切都在集成显卡上按预期工作。如果我错了请纠正我,但看起来这是一个图形驱动程序问题。