windows - wglMakeCurrent 的正确用法?
问题描述
wglMakeCurrent 应该只调用一次还是需要在每次缓冲区交换之前调用?除了通过 wglMakeCurrent 设置它之外,当前的 opengl 上下文是否可以被一些外部事物重置?
我在这里只是为了缩小可能的问题。我不能在这里发布相关代码,因为我不知道哪个部分是相关的。
目前我有循环执行 makeCurrent -> clear -> render。它正确呈现。我尝试在初始化时将上下文设为当前,而不是在每次绘制时都将其设为当前,但它呈现为空屏幕。只有当我退出窗口时,正确的渲染才会闪烁一帧。我认为使用 nvidia 的图形调试器有问题。调试器的覆盖奇怪地闪烁。其他应用程序不会这样做。
解决方案
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 上下文的绑定 - 受影响的上下文不再可用。
推荐阅读
- c# - Unity中Sprite上的滚动纹理以获得背景滚动效果,不起作用
- c++ - QAction::text(),程序收到信号 SIGSEGV,分段错误
- sqlite - 承诺返回所有列值 sqlite ionic sqlite swift
- tensorflow - 在小批量的多 GPU 上进行训练
- python - 在 Raspberry Pi 上运行 TensorFlow 模型推理的首选方法是什么?
- erlang - 在处理状态超时时优雅地退出 gen_statem
- azure-devops - 是否可以只允许利益相关者访问特定的董事会?
- html - 选中复选框 id 但在所有复选框下显示 div
- c# - ASP.NET MVC。如何根据用户权限重定向到 .aspx 页面
- python - 在python中切片关键词成为新的类别列