状态块保存和还原状态 (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 );

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

状态 (Direct3D 9)