您没有发布 wglMakeCurrent() 生成的错误代码,所以我不会猜测原因。然而,这不是绑定本身。句子“一个线程可以有一个当前的渲染上下文”的意思是,新的上下文将“替换”旧的上下文并成为当前的。我不知道您为什么要尝试将两个上下文设置为当前(或运行另一个线程),但这不是要走的路。除非绝对必要,否则避免在渲染中使用多线程。所以,回答你的问题:
是的,您可以“重用”OpenGL 渲染上下文。
为什么,你可能会问?渲染上下文是为特定设备上下文 (HDC) 创建的,这是每个窗口 (HWND) 的专有属性!那这怎么可能?!
好吧,由于函数原型,这似乎是不可能的:
HWND my_window = CreateWindow(...);
HDC my_dc = GetDC(my_new_window);
//设置'my_dc'的像素格式...
HGLRC my_rc = wglCreateContext(my_dc);
wglMakeCurrent(my_dc, my_rc);
这真的让你认为渲染上下文绑定到这个特定的设备上下文并且只对它有效。但事实并非如此。关键部分是注释(设置像素格式)。渲染上下文是为特定CLASS 的 DC创建的,更准确地说:对于具有相同像素格式的 DC。所以下面的代码是完全有效的:
//window_1 = 主窗口,window_2 = 你的窗口
HDC dc_1 = GetDC(window_1);
Set_pixel_format_for_dc_1(); //普通的东西
HGLRC rc = wglCreateContext(dc_1);
wglMakeCurrent(dc_1, rc);
超超画();
//.....
HDC dc_2 = GetDC(window_2);
//获取dc_1的PF以确保它与rc兼容。
int pf_index = GetPixelFormat(dc_1);
像素格式描述符 pfd;
ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));
DescribePixelFormat(dc_1, pf_index, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
SetPixelFormat(dc_2, pf_index, &pfd);
wglMakeCurrent(dc_2, rc);
another_awesome_render();
wglMakeCurrent(NULL, NULL);
如果您仍然不相信,MSDN:
wglMakeCurrent(hdc, hglrc): hdc参数必须引用OpenGL支持的绘图表面。它不必与创建 hglrc 时传递给 wglCreateContext 的 hdc 相同,但它必须位于同一设备上并具有相同的像素格式。
我猜你已经熟悉这些电话了。现在,我不知道你的渲染必须满足什么条件,但是没有额外的要求,从这一点上我看不出有什么困难:
HDC my_dc = Create_my_DC();
//...
无效 my_new_render
{
//可能你想保存当前绑定:
HDC current_dc = wglGetCurrentDC();
HGLRC current_context = wglGetCurrentContext();
wglMakeCurrent(my_dc, current_context);
MyUltraSuperRender(...);
wglMakeCurrent(current_dc, current_context);
}
希望这可以帮助 :)