如何使用Windows内存直流(c ++)创建OpenGL上下文

Sha*_* Zi 2 c++ opengl winapi

在我的Windows MFC应用程序中,在其View类中,我使用View的DC创建了一个OpenGL上下文:

HANDLE * hdc = GetDC()->m_hdc;
int nPixelFormat;
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // Size of this structure
1, // Version of this structure
PFD_DRAW_TO_WINDOW | // Draw to window (not bitmap)
PFD_SUPPORT_OPENGL | // Support OpenGL calls
PFD_DOUBLEBUFFER, // Double -buffered mode
PFD_TYPE_RGBA, // RGBA Color mode
24, // Want 24bit color
0,0,0,0,0,0, // Not used to select mode
0,0, // Not used to select mode
0,0,0,0,0, // Not used to select mode
32, // Size of depth buffer
0, // Not used to select mode
0, // Not used to select mode
PFD_MAIN_PLANE, // Draw in main plane
0, // Not used to select mode
0,0,0 }; // Not used to select mode

// Choose a pixel format that best matches that described in pfd
nPixelFormat = ChoosePixelFormat(hdC, &pfd);
// Set the pixel format for the device context
assert(SetPixelFormat(hdC, nPixelFormat, &pfd));

HGLRC m_hrc = wglCreateContext(hdc);
assert(m_hrc);
wglMakeCurrent(m_hdc,m_hrc);
Run Code Online (Sandbox Code Playgroud)

上面的所有代码都可以正常工作,我可以按预期进行OpenGL绘图.

但是,我现在需要的是将DC更改为内存直流而不是窗口DC.确切地说,我如何使用'hmemDC'来创建一个OpenGL上下文,就像我上面用窗口DC做的那样:

CRect rct;
GetClientRect(&rct);
HDC hmemDC = CreateCompatibleDC(pDC->m_hDC);
HBITMAP hBmp = CreateCompatibleBitmap(pDC->m_hDC,rct.Width(),rct.Height());
Run Code Online (Sandbox Code Playgroud)

使用上面构造的相同像素格式,我在调用wglCreateContext()时遇到"无效像素格式"错误,无法成功获取正确的OpenGL上下文.

我google了很多,并试图改变一些像素格式的值,结果是一样的.

是否可以使用Windows Memory DC创建OpenGL上下文?如果是我应该怎么做?

编辑:这就是我需要位图(或内存DC)的原因:我创建了一个使用OpenGL的2D地图渲染库.客户端希望使用此库来渲染背景图,并在其上绘制自己的符号.但是,他们更喜欢使用OpenGL以外的Windows GDI来绘制符号.所以我想如果我能为他们提供位图或Mmeory DC,他们可以满足他们的需求.更好的解决方案?我是朝着正确的方向吗?或者在OpenGL后端提供这样的2d库是一个完全不好的主意.

der*_*ass 5

这不能以有用的方式完成.

可以在原则上通过渲染为位图PFD_DRAW_TO_BITMAP的标志,而不是PFD_DRAW_TO_WINDOWPIXELFORMATDESCRIPTOR.

但是,这样做会禁用所有硬件加速渲染.这将回归到Microsofts默认的OpenGL 1.1实现.

如果你想要hw-accleration和/或现代GL,你需要一个窗口或一些像pbuffer这样的屏外缓冲区,它可以通过WGL_ARB_pbuffer扩展来获得.但是,在现代GL中,您可能最好创建一个从未显示过的窗口,并使用Frambeuffer对象作为屏幕外渲染目标.

在任何一种情况下,如果需要将数据作为某个位图,则必须将数据复制回CPU.