イベントの処理
DXUT の初期化、ウィンドウの作成、デバイスの作成、およびメイン ループの作成が終了したら、次の手順はイベントの処理です。
DXUT では、アプリケーションでイベントに応答できるようにするために、コールバック関数のメカニズムを使用します。アプリケーションで、一連のコールバック関数を DXUT に登録する必要があります。また、イベントの発生時に、DXUT によってこれらの関数が呼び出されます。DXUT でコールバック関数を登録する必要はないため、アプリケーションによって、必要なコールバック関数のみを自由に登録できます。
コールバック関数によって、DXUTSetCallback* 関数からコールバックに void* pUserContext が渡されます。これにより、クラス ポインターなど、アプリケーションからのコンテキストをコールバック関数で受け取れるようになります。
DXUT では、次の 3 つのイベントが発生します。
- デバイス イベント
- フレーム イベント
- ウィンドウ イベント
デバイス イベント
アプリケーションで Direct3D 9 デバイスを使用してレンダリングしている間に、デバイスが失われる可能性があります (「喪失したデバイス (Direct3D 9)」を参照してください)。これは、ユーザーが Alt + Tab キーを押して全画面モードのアプリケーションから離れたときや、ユーザーが Ctrl + Alt + Del キーを押したときや、ユーザーが別の全画面モードの 3D アプリケーションを実行したときなどに発生します。Direct3D 9 API では、IDirect3DDevice9::Present などの特定の関数の呼び出し時に D3DERR_DEVICELOST が返されることによってこれが発生した場合、アプリケーションに通知します。
デバイスが失われた場合は、アプリケーションによって、存続しないすべての Direct3D オブジェクトが解放されます (既定の (D3DPOOL_DEFAULT) メモリーで作成されたオブジェクトなど)。このようなオブジェクトが解放された場合は、喪失状態から復帰したときにデバイスをリセットできなくなります。一旦デバイスが停止すると、アプリケーションで IDirect3DDevice9::Reset を呼び出して、リセット手順を通過しなかったすべてのデバイスオブジェクトを再作成する必要があります。
DXUT では、変更、作成、リセット、破棄などのさまざまなデバイス イベントを処理するように、アプリケーションにコールバック関数を追加することによってこのプロセスが簡略化されます。DXUT では、喪失状態から復帰したときにデバイスが適切にリセットされます。またアプリケーションのコールバック関数を使用して、デバイス オブジェクトが解放され再作成されます。アプリケーションの役割は、必要に応じてコールバック関数を登録し実装することです。
コールバック登録関数 | アプリケーション コールバック関数 | フレームワークによって呼び出されるとき | リソースに関する注意 |
---|---|---|---|
DXUTSetCallbackDeviceChanging | LPDXUTCALLBACKMODIFYDEVICESETTINGS | Direct3D デバイスが作成される前に呼び出します。これにより、アプリケーションに、false が返されることによるデバイスの変更を拒否するチャンスを与えます。 | - |
DXUTSetCallbackD3D9DeviceCreated またはDXUTSetCallbackD3D10DeviceCreated | LPDXUTCALLBACKD3D9DEVICECREATED またはLPDXUTCALLBACKD3D10DEVICECREATED | Direct3D デバイスが作成された直後に呼び出されます。これは、アプリケーションの初期化とデバイスの再作成の最中に発生します。 | デバイスが破棄されたかどうかに関係なく、これらのリソースの再読み込みが必要なため、D3DPOOL_MANAGED リソースを作成します。 |
DXUTSetCallbackD3D9DeviceReset | LPDXUTCALLBACKD3D9DEVICERESET | Direct3D 9 デバイスがリセットされた直後に呼び出されます。これは、デバイスが失われた後に発生します。 | デバイスが失われたかどうかに関係なく、これらのリソースの再読み込みが必要なため、D3DPOOL_DEFAULT リソースを作成します。 |
DXUTSetCallbackD3D9DeviceLost | LPDXUTCALLBACKD3D9DEVICELOST | Direct3D 9 デバイスが喪失状態に入った直後の、IDirect3DDevice9::Reset が呼び出される前に呼び出されます。 | デバイスのリセットのコールバック関数で作成されたリソースを解放します。これには通常はすべての D3DPOOL_DEFAULT リソースが含まれます。 |
DXUTSetCallbackD3D10SwapChainReleasing | LPDXUTCALLBACKD3D10SWAPCHAINRELEASING | Direct3D 10 のスワップ チェーンがサイズ変更される直前に呼び出されます。 | レンダー ターゲットなどのスワップ チェーンのサイズに基づいたリソースを解放します。 |
DXUTSetCallbackD3D10SwapChainResized | LPDXUTCALLBACKD3D10SWAPCHAINRESIZED | Direct3D 10 のスワップ チェーンがサイズ変更される直後に呼び出されます。 | レンダー ターゲットなどのスワップ チェーンのサイズに基づいたリソースを作成します。 |
DXUTSetCallbackD3D9DeviceDestroyed またはDXUTSetCallbackD3D10DeviceDestroyed | LPDXUTCALLBACKD3D9DEVICEDESTROYED またはLPDXUTCALLBACKD3D10DEVICEDESTROYED | Direct3D デバイスが破棄された直後に呼び出されます。これは通常は、アプリケーションの終了やデバイスの再作成の結果として発生します。 | デバイスにより作成されたコールバック関数で作成されたリソースを解放します。これには通常はすべての D3DPOOL_MANAGED リソースが含まれます。 |
Direct3D 9 デバイスのウィンドウ表示モードと全画面モードとが切り替えられたときは、通常はリセットされますが、Direct3D 9 による再作成が必要になる場合があります。
これらのコールバック登録関数は、すべてオプションです。ただし、これらのほとんどを実装することをお勧めします。アプリケーションによって、デバイスの喪失とデバイスのリセットのコールバック関数、またはデバイスの破棄や作成のコールバック関数が登録されない場合、DXUT には、これらのデバイス イベントが発生したときにアプリケーションに通知する方法がありません。すべての Direct3D 9 デバイス オブジェクトが D3DPOOL_MANAGED メモリー内にない場合は、Direct3D 9 でデバイスのリセットに失敗します。この場合、デバイスの変更や、HAL デバイスと REF デバイスとの切り替えは機能しなくなります。
アプリケーションで Direct3D 9 または Direct3D 10 のどちらもサポートされていない場合は、それらのコールバックのセットは実装されません。DXUT によって、実装されるコールバックに基づいて、アプリケーションでサポートされる Direct3D API が自動的に検出されます。DXUT によってシステム上の Direct3D 10 デバイスが検出され、アプリケーションで Direct3D 9 と Direct3D 10 の両方がサポートされている場合は、既定は Direct3D 10 になります。アプリケーションで Direct3D 10 のみがサポートされているが、Direct3D 10 デバイスが見つからない場合は、DXUT からエラーが返されます。
フレーム イベント
DXUT では、レンダリング処理中にフレームごとに呼び出されるフレーム イベントも提供されます。アプリケーションでは、次のようにコールバック関数を登録して実装する必要があります。
アプリケーション コールバック関数 | コールバック登録関数 | フレームワークによって呼び出されるとき | シーン レンダリング |
---|---|---|---|
DXUTSetCallbackFrameMove | LPDXUTCALLBACKFRAMEMOVE | 各フレームの初めに 1 回呼び出されます。 | このコールバック関数は、アプリケーションでシーンの更新を処理する最適な箇所ですが、実際のレンダリング呼び出しを含むことはできません。レンダリング呼び出しは、代わりに、フレームのレンダリングのコールバック関数内に配置する必要があります。 |
DXUTSetCallbackD3D9FrameRender またはDXUTSetCallbackD3D10FrameRender | LPDXUTCALLBACKD3D9FRAMERENDER またはLPDXUTCALLBACKD3D10FRAMERENDER | 各フレームの最後か、ウィンドウで再描画が必要な場合に呼び出されます。 | シーンのためのすべてのレンダリング呼び出しは、このコールバック関数内で実行される必要があります。このコールバック関数が返されると、フレームワークによって IDirect3DDevice9::Present が呼び出され、スワップ チェーン内の次のバッファーのコンテンツが表示されます。 |
メッセージ イベント
DXUT によって、次のコールバック関数とそれらに対応する登録関数を通じて、ウィンドウ メッセージ、キーボード イベント、およびマウス イベントが渡されます。、アプリケーションを、これらのイベントに適切に応答するようにプログラムします。
アプリケーション コールバック関数 | コールバック登録関数 | 説明 |
---|---|---|
DXUTSetCallbackMsgProc | LPDXUTCALLBACKMSGPROC | メッセージ ポンプからのウィンドウ メッセージを処理します。 |
DXUTSetCallbackKeyboard | LPDXUTCALLBACKKEYBOARD | メッセージ ポンプからのキーボード イベントを処理します。 |
DXUTSetCallbackMouse | LPDXUTCALLBACKMOUSE | メッセージ ポンプからのマウス イベントを処理します。 |
次の手順
DXUT に関するその他のトピックは、このプログラミング ガイドと、対の「DXUT リファレンス」にあります。