在我的Windows MFC应用程序中,在其视图类中,我使用View's 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);
上面的所有代码都可以正常工作,我可以按预期进行openGL图纸。
但我现在需要的是将直流变为内存DC而不是窗口DC。准确地说,我该如何使用“ HMEMDC”波纹管创建一个OpenGL上下文,就像我在Window DC上所做的那样:
CRect rct;
GetClientRect(&rct);
HDC hmemDC = CreateCompatibleDC(pDC->m_hDC);
HBITMAP hBmp = CreateCompatibleBitmap(pDC->m_hDC,rct.Width(),rct.Height());
在上面构造的相同的像素格式的情况下,我在调用WGLCreateContext()时遇到了“无效的像素格式”错误,无法成功获得正确的OpenGL上下文。
我搜索了很多谷歌,并尝试更改像素格式的某些值,结果是相同的。
可以使用Windows Memory DC创建OpenGL上下文?如果我该怎么做?
Edit: 这就是为什么我需要一个位图(或内存DC):我创建了一个使用OpenGL的2D Map渲染库。 客户希望使用此库来渲染背景图,并在其顶部绘制自己的符号。但是,他们更喜欢使用除OpenGL以外的Windows GDI绘制其符号。 因此,我认为如果我能为他们提供位图或Mmeory DC,他们可以按照自己的需求。有更好的解决方案吗? 我朝正确的方向吗?或者在OpenGL后端提供这样的2D库是一个不好的主意。
这不能以有用的方式完成。 您的
canPFD_DRAW_TO_BITMAP
标志而不是
PFD_DRAW_TO_WINDOW
PIXELFORMATDESCRIPTOR
。
,但是,这样做将可降低所有硬件加速渲染。这将返回Microsoft的默认OpenGL 1.1实现。
如果您想要这样的加速度和/或现代GL,则需要一个窗口或一些屏幕外缓冲区,例如Pbuffer,可以通过
WGL_ARB_PBUFFER扩展提供。但是,在现代GL中,您可能会更好地创建一个永远不会显示的窗口,然后将framebuffer对象作为屏幕外渲染目标。 在任何一种情况下,如果您需要在此处进行一些位图,则必须将数据复制回CPU。
用几句话输入:您无法为memDC创建任意的OpenGL上下文。至少您实际上不想使用openGL上下文。
如果您的目标是在屏幕外渲染,则可以创建Pbuffer-DC;首先需要创建一个OpenGL上下文,而该上下文又需要创建窗口并设置其像素格式。或者,您只需为其创建一个窗口和一个OpenGL上下文,然后使用Framebuffer对象。