レンダリング コンテキスト関数
次の表に示すように、5 つの WGL 関数によってレンダリング コンテキストが管理されます。
WGL 関数 | 説明 |
---|---|
wglCreateContext | 新しいレンダリング コンテキストを作成します。 |
wglMakeCurrent | スレッドの現在のレンダリング コンテキストを設定します。 |
wglGetCurrentContext | スレッドの現在のレンダリング コンテキストへのハンドルを取得します。 |
wglGetCurrentDC | スレッドの現在のレンダリング コンテキストに関連付けられているデバイス コンテキストへのハンドルを取得します。 |
wglDeleteContext | レンダリング コンテキストを削除します。 |
wglCreateContext 関数は、デバイス コンテキスト ハンドルをパラメーターとして受け取り、レンダリング コンテキスト ハンドルを返します。 作成されたレンダリング コンテキストは、デバイス コンテキスト ハンドルによって参照されるデバイスでの描画に適しています。 特に、そのピクセル形式はデバイス コンテキストのピクセル形式と同じです。 レンダリング コンテキストを作成したら、デバイス コンテキストを解放または破棄できます。 デバイス コンテキストの作成、取得、解放、破棄の詳細については、「デバイス コンテキスト」を参照してください。
Note
wglCreateContext に送信されるデバイス コンテキストは、ディスプレイ デバイス コンテキスト、メモリ デバイス コンテキスト、またはピクセルあたり 4 ビット以上を使用するカラー プリンター デバイス コンテキストである必要があります。 デバイス コンテキストをモノクロ プリンター デバイス コンテキストにすることはできません。
wglMakeCurrent 関数は、レンダリング コンテキスト ハンドルとデバイス コンテキスト ハンドルをパラメーターとして受け取ります。 スレッドによって行われる後続の OpenGL 呼び出しはすべて、そのレンダリング コンテキストを通じて行われ、そのデバイス コンテキストによって参照されるデバイスに描画されます。 デバイス コンテキストは、レンダリング コンテキストの作成時に wglCreateContext に渡されたものと同じである必要はありませんが、同じデバイス上にあり、同じピクセル形式である必要があります。 wglMakeCurrent の呼び出しにより、指定されたレンダリング コンテキストとデバイス コンテキスト間の関連付けが作成されます。 現在のレンダリング コンテキストに関連付けられているデバイス コンテキストは、レンダリング コンテキストを最新でない状態にするまで解放または破棄できません。
スレッドに現在のレンダリング コンテキストが設定されると、OpenGL グラフィックス呼び出しを行うことができます。 すべての呼び出しがレンダリング コンテキストを通過する必要があります。 現在のレンダリング コンテキストがないスレッドから OpenGL グラフィックス呼び出しを行った場合、何も起こりません。
wglGetCurrentContext 関数はパラメーターを受け取らず、呼び出し元スレッドの現在のレンダリング コンテキストへのハンドルを返します。 スレッドに現在のレンダリング コンテキストがない場合、戻り値は NULL となります。
wglGetCurrentDCを呼び出して、スレッドの現在のレンダリング コンテキストに関連付けられているデバイス コンテキストへのハンドルを取得すると、レンダリング コンテキストが最新の状態になったときに関連付けが作成されます。
現在のレンダリング コンテキストとスレッドの間の関連付けを解除するには、次の 2 つのハンドルのいずれかを使用して wglMakeCurrent を呼び出します。
- null レンダリング コンテキスト ハンドル
- 最初に呼び出されたもの以外のハンドル
レンダリング コンテキスト ハンドル パラメーターを NULL に設定して wglMakeCurrent を呼び出した後、呼び出し元のスレッドには現在のレンダリング コンテキストがありません。 レンダリング コンテキストはスレッドへの接続から解放され、レンダリング コンテキストとデバイス コンテキストの関連付けは終了します。 OpenGL はすべての描画コマンドをフラッシュし、一部のリソースを解放する場合があります。 スレッドは現在のレンダリング コンテキストを回復するまで OpenGL グラフィックス呼び出しを実行できないため、wglMakeCurrent の次回の呼び出しまで OpenGL 描画は実行されません。
レンダリング コンテキストとスレッドの間の関連付けを解除する 2 つ目の方法は、異なるレンダリング コンテキストで wglMakeCurrent を呼び出す方法です。 このような呼び出しの後、呼び出し元のスレッドは新しい現在のレンダリング コンテキストを持ち、以前の現在のレンダリング コンテキストはスレッドへの接続から解放され、デバイス コンテキストへの以前の現在のレンダリング コンテキストの関連付けは終了します。
wglDeleteContext 関数は、削除するレンダリング コンテキストへのハンドルである 1 つのパラメーターを受け取ります。 wglDeleteContext を呼び出す前に、wglMakeCurrent を呼び出してレンダリング コンテキストを最新の状態にせず、必要に応じて DeleteDC または ReleaseDC を呼び出して、関連付けられているデバイス コンテキストを削除または解放します。
スレッドが別のスレッドの現在のレンダリング コンテキストであるレンダリング コンテキストを削除するのはエラーです。 ただし、レンダリング コンテキストが呼び出し元スレッドの現在のレンダリング コンテキストである場合、wglDeleteContext はすべての OpenGL 描画コマンドをフラッシュし、レンダリング コンテキストを削除する前に最新の状態にしません。 この場合、wglDeleteContext に依存してレンダリング コンテキストを最新ではない状態にするには、が関連付けられているデバイス コンテキストをプログラマーが削除または解放する必要があります。