小编mya*_*lim的帖子

从OpenGL切换到GDI

我们有一个应用程序,我们使用GDI和OpenGL来绘制相同的HWND,但是只有.

例:

  • 最初我们处于二维模式,所以我们使用GDI进行绘制
  • 然后我们切换到3D模式,我们使用OpenGL绘制它
  • 然后我们切换回2d模式,我们使用GDI绘制它

当切换到3d模式时,我们只为该HWND创建一个OpenGL上下文,我们可以使用OpenGL绘制它.当切换回2d模式时,我们只是破坏OpenGL上下文,我们可以使用GDI绘制到HWND.

直到最近,这种方法运作良好.在Windows 10上,对于某些NVidia卡,如果驱动程序比382.05更新,则此功能不再起作用.在这种情况下,当我们删除OpenGL上下文并使用GDI在HWND上绘图时,窗口仍然显示来自OpenGL的最后一个内容.

我检查了所有可用的像素格式.所有人都有同样的问题.

我们做错了什么,还是NVidia错误?你看到解决方案/解决方法吗?

它可能与NVidia + Intel双GPU设置有关,但至少有一个反例.我们有反馈的卡片:

不复制:

  • GTX 980M,单GPU
  • GTX 1060,单GPU

转载:

  • GTX 1060(Forceware 397.31)+ Intel HD Graphics 630
  • Quadro M3000M(Forceware 387.95)+ Intel HD Graphics P530
  • Qudrao K110M + Intel HD 4600
  • Quadro P3000 + Intel HD 630
  • Quadro M4000(Forceware 385.90),单GPU

在OpenGL中绘制2d内容不是一种选择,反之亦然.此外,该应用程序对性能非常敏感,因此不能选择将2d内容绘制到屏幕外的GDI图像,以便将其绘制为OpenGL四元组.它也不是销毁和重新创建HWND的选项.

下面是重现该问题的示例应用程序.默认情况下,应用程序显示蓝色背景,其中一些文本处于GDI模式.在OpenGL模式下,显示了旋转三角形.空格键用于在模式之间切换.

#include <windows.h>
#include <GL/gl.h>
#include <iostream>

#pragma comment( lib, "OpenGL32.lib" )


HWND s_hwnd = 0;
HDC s_hdc = 0;
HGLRC s_hglrc = 0;

bool s_quit = false;

static HGLRC createContext(HWND …
Run Code Online (Sandbox Code Playgroud)

c++ opengl winapi gdi nvidia

7
推荐指数
1
解决办法
603
查看次数

标签 统计

c++ ×1

gdi ×1

nvidia ×1

opengl ×1

winapi ×1