状態ブロックの状態の保存と復元 (Direct3D 9)

状態ブロックは、デバイス状態のグループです。 デバイスの状態は、レンダリング状態、頂点状態、ピクセル状態、または上記のすべてで構成されます。 状態ブロックには、デバイスの現在の状態のスナップショットが含まれています。または、アプリケーションが行う各状態変更を記録する状態ブロックを作成できます。

状態のブロックをキャプチャする

キャプチャする状態の種類を選択し、次のような状態ブロックを作成します。

IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->CreateStateBlock( D3DSBT_ALL, &pStateBlock );

IDirect3DDevice9::CreateStateBlock は状態ブロックを作成し、デバイスの状態を自動的にキャプチャします。 デバイスの状態は、最初の引数の状態ブロックの種類によって指定されます。 この状態は、すべてのデバイス状態 ( 「StateBlock を使用してすべてのデバイス状態を保存する (Direct3D 9)」を参照)、すべてのピクセル状態 (「 Saving Pixel State With a StateBlock (Direct3D 9)」を参照)、またはすべての頂点状態 (「 StateBlock を使用して頂点の状態を保存する (Direct3D 9)」を参照) のいずれかです。

効果システムでは、状態ブロックを使用して状態を保存します。 ID3DXEffect::Begin が呼び出されると、状態ブロックが作成され、状態がキャプチャされます。 ID3DXEffect::End が呼び出されると、状態ブロックの状態がデバイスに再適用されます。

個々の状態をキャプチャする

カスタム状態シーケンスを保存するには、IDirect3DDevice9::BeginStateBlock と IDirect3DDevice9::EndStateBlock ペアで保存する状態をラップします。 BeginStateBlock は、現在のデバイスに状態ブロックを設定し、EndStateBlock が呼び出されるまで発生するすべての状態変更を追加するように指示します。 次に例を示します。

IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->BeginStateBlock();
pd3dDevice->SetRenderState ( D3DRS_ZENABLE, true );
pd3dDevice->EndStateBlock( &pStateBlock );

これにより、任意のシーケンス内の任意の数の状態変更がカスタム状態ブロックに保存されます。 後で stateblock を使用してデバイスの状態をリセットする場合は、 IDirect3DStateBlock9::Apply を呼び出します。 これにより、状態ブロックでキャプチャされたデバイスの状態のみが上書きされます。 カスタム stateblock でキャプチャされなかったその他のデバイス状態は変更されません。 もう一度、stateblock オブジェクトはインターフェイスであるため、終了したら解放する必要があります。

状態 (Direct3D 9)