您没有发布由wglMakeCurrent()生成的错误代码,所以我不会猜测原因。然而,这不是绑定本身。句子“一个线程可以有一个当前的渲染上下文”意味着,新的上下文将'替换'旧的并成为当前的。我不知道你为什么要设置两个上下文作为当前(或运行另一个线程),但它不是要走的路。除非绝对必要,否则不要在渲染中使用多线程。 所以,回答你的问题:
是的,你CAN'重用'OpenGL渲染上下文。
为什么,你可能会问?为特定的设备上下文(HDC)创建渲染上下文,这是每个窗口(HWND)的专有属性!这怎么可能呢?
嗯,这看起来有点不可能的,因为函数原型:
HWND my_window = CreateWindow(...);
HDC my_dc = GetDC(my_new_window);
//Setup pixel format for 'my_dc'...
HGLRC my_rc = wglCreateContext(my_dc);
wglMakeCurrent(my_dc, my_rc);
这真的让你认为渲染上下文被绑定到这个特定的设备上下文,只为它有效。但事实并非如此。 关键部分是评论(设置像素格式)。渲染上下文是为特定的DC类创建的,更确切地说:对于具有相同像素格式的DC。所以下面的代码是完全合法:
//window_1 = main window, window_2 = your window
HDC dc_1 = GetDC(window_1);
Set_pixel_format_for_dc_1(); //Usual stuff
HGLRC rc = wglCreateContext(dc_1);
wglMakeCurrent(dc_1, rc);
ultra_super_draw();
//.....
HDC dc_2 = GetDC(window_2);
//Get dc_1's PF to make sure it's compatible with rc.
int pf_index = GetPixelFormat(dc_1);
PIXELFORMATDESCRIPTOR 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();
//...
void my_new_render
{
//Probably you want to save current binding:
HDC current_dc = wglGetCurrentDC();
HGLRC current_context = wglGetCurrentContext();
wglMakeCurrent(my_dc, current_context);
MyUltraSuperRender(...);
wglMakeCurrent(current_dc, current_context);
}
希望这有助于:)