Состояние сохранения и восстановления блоков состояния (Direct3D 9)
Блок состояния — это группа состояний устройства. Состояние устройства состоит из состояния отрисовки, состояния вершины, состояния пикселя или всего выше. Блок состояния содержит моментальный снимок текущего состояния устройства или создать блок состояния, который записывает каждое изменение состояния приложения.
Захват блока состояния
Выберите тип состояния, которое требуется записать, и создайте блок состояния следующим образом:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->CreateStateBlock( D3DSBT_ALL, &pStateBlock );
IDirect3Device9::CreateStateBlock создает блок состояния и автоматически записывает состояние устройства. Состояние устройства указывается типом блока состояния в первом аргументе. Это состояние может быть одним из следующих: все состояния устройства (см. сохранение всех состояний устройства с помощьюStateBlock (Direct3D 9), все состояния пикселей (см. сохранение состояния пикселя с помощьюStateBlock (Direct3D 9) или все состояния вершины (см. сохранение состояний вершин с помощью StateBlock (Direct3D 9)).
Система эффектов использует блок состояния для сохранения состояния. После вызова ID3DXEffect::Begin создается блок состояния и записывается состояние. При вызове ID3DXEffect::End состояние блока состояния повторно применяется к устройству.
Захват отдельных состояний
Чтобы сохранить настраиваемую последовательность состояний, заключите состояние, которое требуется сохранить в IDirect3Device9::BeginStateBlock и IDirect3Device9::EndStateBlock пару. BeginStateBlock сообщает текущему устройству настроить блок состояния и добавить в него каждое изменение состояния, которое происходит до вызова EndStateBlock. Ниже приведен пример:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->BeginStateBlock();
pd3dDevice->SetRenderState ( D3DRS_ZENABLE, true );
pd3dDevice->EndStateBlock( &pStateBlock );
Это позволит сохранить любое количество изменений состояния в любой последовательности в пользовательском блоке состояния. Позже, когда вы хотите использовать блок состояния для сброса состояния устройства, вызовите IDirect3DStateBlock9::Apply. Это перезаписывает только состояние устройства, записанное в блоке состояния. Любое другое состояние устройства, которое не было записано с пользовательским блоком состояния, не будет изменено. Еще раз, так как объект stateblock является интерфейсом, вам потребуется освободить его после завершения работы с ним.
Связанные разделы