次の方法で共有


ステート ブロックによるステートの保存と復元 (Direct3D 9)

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

ステートのブロックのキャプチャー

キャプチャーするステートのタイプを選択し、次のようにブロックを作成します。

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

IDirect3DDevice9::CreateStateBlock によってステート ブロックが作成され、自動的にデバイス ステートがキャプチャーされます。デバイス ステートは、最初の引数のステート ブロック タイプによって指定されます。このステートは、すべてのデバイス ステート (「ステート ブロックでのすべてのデバイス ステートの保存 (Direct3D 9)」を参照してください)、すべてのピクセル ステート (「ステート ブロックでのピクセル ステートの保存 (Direct3D 9)」を参照してください)、またはすべての頂点ステート (「ステート ブロックでの頂点ステートの保存 (Direct3D 9)」を参照してください) のいずれかのステートです。

エフェクト システムでは、ステートの保存にステート ブロックが使用されます。ID3DXEffect::Begin が呼び出されると、ステート ブロックが作成され、ステートがキャプチャーされます。ID3DXEffect::End が呼び出される場合は、ステート ブロックのステートがデバイスに再適用されます。

個々のステートのキャプチャー

カスタムのステート シーケンスを保存するには、保存するステートを IDirect3DDevice9::BeginStateBlockIDirect3DDevice9::EndStateBlock のペアで範囲指定します。BeginStateBlock は、現在のデバイスに、ステート ブロックを設定することと、EndStateBlock が呼び出されるまでに発生した、ステートに対するすべての変更をそれに追加することを指示します。次に、1 つの例を示します。

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

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

関連項目

ステート (Direct3D 9)