gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:58 24 4
gpt4 key购买 nike

在我的 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);

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

但是,我现在需要的是将DC改为内存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());

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

我搜索了很多,并尝试更改像素格式的一些值,结果是一样的。

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

编辑:这就是我需要位图(或内存 DC)的原因:我创建了一个使用 OpenGL 的二维 map 渲染库。客户想用这个库来渲染背景图,并在上面绘制自己的符号。但是,他们更喜欢使用 Windows GDI 而不是 OpenGL 来绘制符号。所以我想如果我能为他们提供位图或 Mmeory DC,他们就可以随心所欲。有更好的解决方案吗?我的方向正确吗?或者在 OpenGL 后端提供这样的 2d 库是一个完全糟糕的主意。

最佳答案

这无法以有用的方式完成。

原则上,您可以通过使用 PFD_DRAW_TO_BITMAP 标志而不是 PIXELFORMATDESCRIPTOR 中的 PFD_DRAW_TO_WINDOW 呈现位图.

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

如果你想要硬件加速和/或现代 GL,你要么需要一个窗口,要么需要一些像 pbuffer 这样的屏幕外缓冲区,它可以通过 WGL_ARB_pbuffer 获得。扩大。但是,在现代 GL 中,您最好创建一个从未显示的窗口,并使用 Frambeuffer Object作为离屏渲染目标。

在任何一种情况下,如果您需要将数据作为位图复制回 CPU。

关于c++ - 如何使用 Windows 内存 dc (c++) 创建 OpenGL 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com