Поделиться через


Состояние сохранения и восстановления блоков состояния (Direct3D 9)

Блок состояний — это группа состояний устройства. Состояние устройства состоит из состояния отрисовки, состояния вершины, состояния пикселей или всего вышеперечисленного. Блок состояния содержит snapshot текущего состояния устройства, или вы можете создать блок состояния, который записывает каждое изменение состояния, которое вносит приложение.

Запись блока состояния

Выберите тип состояния, которое требуется записать, и создайте блок состояния следующим образом:

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

IDirect3DDevice9::CreateStateBlock создает блок состояния и автоматически записывает состояние устройства. Состояние устройства указывается типом блока состояния в первом аргументе. Это может быть одно из следующих состояний: все состояния устройства (см. раздел Сохранение всех состояний устройств с помощью StateBlock (Direct3D 9)), состояние всех пикселей (см. раздел Сохранение состояния пикселей с помощью StateBlock (Direct3D 9)) или состояние всех вершин (см. раздел Сохранение состояний вершин с помощью StateBlock (Direct3D 9)).

Система эффектов использует блок состояния для сохранения состояния. После вызова ID3DXEffect::Begin создается блок состояния и фиксируется состояние. При вызове ID3DXEffect::End состояние блока состояния повторно применяется к устройству.

Запись отдельных состояний

Чтобы сохранить настраиваемую последовательность состояний, заключите состояние, которое требуется сохранить, в пару IDirect3Device9::BeginStateBlock и IDirect3DDevice9::EndStateBlock . BeginStateBlock указывает текущему устройству настроить блок состояний и добавить в него каждое изменение состояния, которое происходит до вызова EndStateBlock. Ниже приведен пример:

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

Это позволит сохранить любое количество изменений состояния в любой последовательности в пользовательском блоке состояния. Позже, если вы захотите с помощью stateblock сбросить состояние устройства, вызовите IDirect3DStateBlock9::Apply. Это приведет к перезаписи только состояния устройства, записанного в блоке состояний. Любое другое состояние устройства, которое не было записано с помощью пользовательского блокировщика состояния, не будет изменено. Еще раз, так как объект stateblock является интерфейсом, его необходимо освободить после завершения работы с ним.

Состояния (Direct3D 9)