wglMakeCurrent 的正确用法?
Correct usage of wglMakeCurrent?
wglMakeCurrent 应该只调用一次还是需要在每次缓冲区交换之前调用?
除了通过 wglMakeCurrent 设置它之外,当前的 opengl 上下文是否可以通过一些外部事物重置?
我来这里只是为了缩小可能出现的问题。我无法在此处 post 相关代码,因为我不知道哪个部分是相关的。
目前我有循环 makeCurrent -> clear -> render。它呈现正确。我尝试在初始化时使上下文成为当前状态,而不是在每次绘制时都使其成为当前状态,但它呈现为空屏幕。只有当我退出 window 时,正确的渲染才会闪烁一帧。我发现使用 nvidia 的图形调试器有问题。调试器的覆盖奇怪地闪烁。它不会对其他应用程序执行此操作。
Is wglMakeCurrent supposed to be called only once
每个 GL 上下文最多可以成为一个线程的当前线程,并且可以在每个单独的时间点绘制。如果你只使用一个Window和一个GL Context,那么在创建context和window.
后只调用一次wglMakeCurrent
就足够了
如果您将一个上下文用于多个 windows,则必须至少每帧和 window 重新绑定一次。请注意,切换当前上下文或 window 传统上意味着刷新 GL 管道,但现在可以通过 KHR_context_flush_control
extension 来防止这种情况,从而使这种方案更加有效。
如果您使用多个线程但使用单个 GL 上下文,则必须通过在某个线程中将其设为非当前并在新线程中再次将其设为当前,将上下文从一个线程推送到另一个线程,等等。但该方案几乎从来没有必要。对于多线程 GL,您应该创建多个 shared 上下文,然后,通常每个线程需要一个 wglMakeCurrent
。
or does it need to be called before every buffer swap?
请注意,SwapBuffers
函数 不是 GL 函数(因此名称中也没有 gl
前缀),因此,确实独立工作当前活动的 GL 上下文的 - 该函数采用您希望缓冲区交换发生的 window 的 HDC
。
Can current opengl context be reset by some external thing other then setting it via 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 上下文 - 受影响的上下文不再可用。
wglMakeCurrent 应该只调用一次还是需要在每次缓冲区交换之前调用? 除了通过 wglMakeCurrent 设置它之外,当前的 opengl 上下文是否可以通过一些外部事物重置?
我来这里只是为了缩小可能出现的问题。我无法在此处 post 相关代码,因为我不知道哪个部分是相关的。
目前我有循环 makeCurrent -> clear -> render。它呈现正确。我尝试在初始化时使上下文成为当前状态,而不是在每次绘制时都使其成为当前状态,但它呈现为空屏幕。只有当我退出 window 时,正确的渲染才会闪烁一帧。我发现使用 nvidia 的图形调试器有问题。调试器的覆盖奇怪地闪烁。它不会对其他应用程序执行此操作。
Is wglMakeCurrent supposed to be called only once
每个 GL 上下文最多可以成为一个线程的当前线程,并且可以在每个单独的时间点绘制。如果你只使用一个Window和一个GL Context,那么在创建context和window.
后只调用一次wglMakeCurrent
就足够了
如果您将一个上下文用于多个 windows,则必须至少每帧和 window 重新绑定一次。请注意,切换当前上下文或 window 传统上意味着刷新 GL 管道,但现在可以通过 KHR_context_flush_control
extension 来防止这种情况,从而使这种方案更加有效。
如果您使用多个线程但使用单个 GL 上下文,则必须通过在某个线程中将其设为非当前并在新线程中再次将其设为当前,将上下文从一个线程推送到另一个线程,等等。但该方案几乎从来没有必要。对于多线程 GL,您应该创建多个 shared 上下文,然后,通常每个线程需要一个 wglMakeCurrent
。
or does it need to be called before every buffer swap?
请注意,SwapBuffers
函数 不是 GL 函数(因此名称中也没有 gl
前缀),因此,确实独立工作当前活动的 GL 上下文的 - 该函数采用您希望缓冲区交换发生的 window 的 HDC
。
Can current opengl context be reset by some external thing other then setting it via
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 上下文 - 受影响的上下文不再可用。