首页 > 解决方案 > wglMakeCurrent 的正确用法?

问题描述

wglMakeCurrent 应该只调用一次还是需要在每次缓冲区交换之前调用?除了通过 wglMakeCurrent 设置它之外,当前的 opengl 上下文是否可以被一些外部事物重置?

我在这里只是为了缩小可能的问题。我不能在这里发布相关代码,因为我不知道哪个部分是相关的。

目前我有循环执行 makeCurrent -> clear -> render。它正确呈现。我尝试在初始化时将上下文设为当前,而不是在每次绘制时都将其设为当前,但它呈现为空屏幕。只有当我退出窗口时,正确的渲染才会闪烁一帧。我认为使用 nvidia 的图形调试器有问题。调试器的覆盖奇怪地闪烁。其他应用程序不会这样做。

标签: windowswinapiopenglwgl

解决方案


wglMakeCurrent 是否应该只调用一次

每个 GL 上下文最多可以在一个线程中使用,并且在每个时间点都可以绘制。如果只使用一个 Window 和一个 GL Context,那么wglMakeCurrent在创建了上下文和窗口之后,只调用一次就足够了。

如果您对多个窗口使用一个上下文,则必须在每个框架和窗口中至少重新绑定一次。请注意,切换当前上下文或窗口传统上意味着刷新 GL 管道,但现在可以通过KHR_context_flush_control扩展来防止这种情况,从而使这种方案更加高效。

如果您使用多个线程但使用单个 GL 上下文,则必须在线程之间推动上下文,方法是使其在某个线程中成为非当前线程,并使其在新线程中再次成为当前线程,依此类推。但该计划几乎永远不需要。Fur 多线程 GL,您应该创建多个共享上下文,然后,您通常需要wglMakeCurrent每个线程一个。

还是需要在每次缓冲区交换之前调用它?

请注意,该SwapBuffers函数不是GL 函数(因此gl名称中也没有前缀),因此,它确实独立于当前活动的 GL 上下文工作 - 该函数采用HDC您希望发生缓冲区交换的窗口的 。

当前的opengl上下文是否可以通过一些外部事物重置,然后通过设置它wglMakeCurrent

不,不是。有可以通过ARB_robustness处理的图形重置情况:

*   Provide a mechanism for an OpenGL application to learn about
    graphics resets that affect the context.  When a graphics reset
    occurs, the OpenGL context becomes unusable and the application
    must create a new context to continue operation. Detecting a
    graphics reset happens through an inexpensive query.

但是这样的 _graphics 重置不会解除当前 GL 上下文的绑定 - 受影响的上下文不再可用。


推荐阅读