wglMakeCurrent() によって生成されたエラー コードを投稿していないので、その理由は推測できません。ただし、バインディング自体ではありません。「スレッドは現在のレンダリング コンテキストを 1 つ持つことができる」という文は、新しいコンテキストが古いコンテキストを「置き換え」、現在のコンテキストになることを意味します。2 つのコンテキストを現在のコンテキストとして設定しようとしている (または別のスレッドを実行しようとしている) 理由はわかりませんが、それは方法ではありません。どうしても必要な場合を除き、レンダリングでのマルチスレッド化は避けてください。だから、あなたの質問に答える:
はい、OpenGL レンダリング コンテキストを「再利用」できます。
なぜ、あなたは尋ねるかもしれませんか?レンダリング コンテキストは、各ウィンドウ (HWND) の排他的プロパティである特定のデバイス コンテキスト (HDC) に対して作成されます。では、どうしてこれが可能になるのでしょうか?!
関数プロトタイプのせいで、なんとなく不可能に思えます。
HWND my_window = CreateWindow(...);
HDC my_dc = GetDC(my_new_window);
//「my_dc」のピクセル形式を設定...
HGLRC my_rc = wglCreateContext(my_dc);
wglMakeCurrent(my_dc, my_rc);
これにより、レンダリング コンテキストがこの特定のデバイス コンテキストにバインドされ、そのコンテキストに対してのみ有効であると考えることができます。しかし、そうではありません。重要な部分はコメント (設定ピクセル形式) です。レンダリング コンテキストは、DC の特定の CLASS 、より正確には、同じピクセル形式の 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);
ultra_super_draw();
//.....
HDC dc_2 = GetDC(window_2);
// dc_1 の PF を取得して、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
{
//おそらく、現在のバインディングを保存したいでしょう:
HDC current_dc = wglGetCurrentDC();
HGLRC current_context = wglGetCurrentContext();
wglMakeCurrent(my_dc, current_context);
MyUltraSuperRender(...);
wglMakeCurrent(current_dc, current_context);
}
お役に立てれば :)