Blocchi di stato Salva e ripristina stato (Direct3D 9)

Un blocco di stato è un gruppo di stati del dispositivo. Lo stato del dispositivo è costituito da stato di rendering, stato del vertice, stato pixel o tutto quello precedente. Un blocco di stato contiene uno snapshot dello stato corrente di un dispositivo oppure è possibile creare un blocco di stato che registra ogni modifica dello stato apportata dall'applicazione.

Acquisire un blocco di stato

Scegliere il tipo di stato da acquisire e creare un blocco di stato simile al seguente:

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

IDirect3DDevice9::CreateStateBlock crea un blocco di stato e acquisisce automaticamente lo stato del dispositivo. Lo stato del dispositivo viene specificato dal tipo di blocco di stato nel primo argomento. Questo stato può essere uno dei seguenti: tutto lo stato del dispositivo (vedere Salvataggio di tutti gli stati del dispositivo con stateBlock (Direct3D 9)), tutto lo stato pixel (vedere Salvataggio dello stato pixel con stato (Direct3D 9)) o tutto lo stato del vertice (vedere Salvataggio degli stati del vertice con uno StateBlock (Direct3D9)).

Il sistema dell'effetto usa un blocco di stato per salvare lo stato. Dopo aver chiamato ID3DXEffect::Begin , viene creato un blocco di stato e lo stato viene acquisito. Quando viene chiamato ID3DXEffect::End , lo stato del blocco di stato viene riapplicato al dispositivo.

Acquisire singoli stati

Per salvare una sequenza di stato personalizzata, eseguire il wrapping dello stato da salvare in una coppia IDirect3DDevice9::BeginStateBlock e IDirect3DDevice9::EndStateBlock. BeginStateBlock indica al dispositivo corrente di configurare un blocco di stato e aggiungerlo ogni modifica dello stato che si verifica fino a quando EndStateBlock non viene chiamato. Ecco un esempio:

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

In questo modo verrà salvato qualsiasi numero di modifiche dello stato in qualsiasi sequenza in un blocco di stato personalizzato. In seguito, quando si vuole usare il blocco stato per reimpostare lo stato del dispositivo, chiamare IDirect3DStateBlock9::Apply. Verrà sovrascritto solo lo stato del dispositivo acquisito nel blocco di stato. Qualsiasi altro stato del dispositivo che non è stato acquisito con il blocco stato personalizzato non verrà modificato. Ancora una volta, poiché l'oggetto stateblock è un'interfaccia, sarà necessario rilasciarlo al termine.

Stati (Direct3D 9)