状态块保存和还原状态 (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::BeginStateBlockIDirect3DDevice9::EndStateBlock 对中。 BeginStateBlock 告知当前设备设置状态块,并在调用 EndStateBlock 之前向其添加发生的每个状态更改。 下面是一个示例:

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

这会将任意序列中任意数量的状态更改保存到自定义状态块中。 稍后,如果要使用状态块重置设备状态,请调用 IDirect3DStateBlock9::Apply。 这将仅覆盖状态块中捕获的设备状态。 不会更改未使用自定义状态块捕获的任何其他设备状态。 同样,由于 stateblock 对象是一个接口,因此在使用完状态块对象后,需要释放它。

状态 (Direct3D 9)