狀態欄塊儲存和還原狀態 (Direct3D 9)
狀態欄塊是一組裝置狀態。 裝置狀態是由轉譯狀態、頂點狀態、圖元狀態或上述所有狀態所組成。 狀態欄塊包含裝置目前狀態的快照集,或者您可以建立狀態欄塊來記錄應用程式所做的每個狀態變更。
擷取狀態欄塊
選擇您想要擷取的狀態類型,並建立如下所示的狀態欄塊:
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 物件是介面,所以當您完成時,您將需要釋放它。
相關主題