状態ブロックは、デバイスの状態のグループです。 デバイスの状態は、レンダリング状態、頂点状態、ピクセル状態、または上記のすべてで構成されます。 状態ブロックには、デバイスの現在の状態のスナップショットが含まれています。または、アプリケーションで行われる各状態変更を記録する状態ブロックを作成できます。
状態ブロックをキャプチャする
キャプチャする状態の種類を選択し、次のように状態ブロックを作成します。
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->CreateStateBlock( D3DSBT_ALL, &pStateBlock );
IDirect3DDevice9::CreateStateBlock は状態ブロックを作成し、デバイスの状態を自動的にキャプチャします。 デバイスの状態は、最初の引数の状態ブロックの種類によって指定されます。 この状態は、すべてのデバイス状態 (StateBlock (Direct3D 9)を使用してすべてのデバイス状態を保存する)、すべてのピクセル状態 (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 オブジェクトはインターフェイスであるため、終了したら解放する必要があります。
関連トピック