状态对象 (Direct3D 10)

在 Direct3D 10 中,设备状态分组到状态对象中,这极大地降低了状态更改的成本。 有多个状态对象,每个对象旨在初始化特定管道阶段的一组状态。 最多可以创建每种状态对象的 4096 个类型。

Input-Layout 状态

此状态组(请参阅 D3D10_INPUT_ELEMENT_DESC)指示 输入装配器阶段如何 从输入缓冲区读取数据并将其组装出来供顶点着色器使用。 这包括输入缓冲区中的元素数和输入数据的签名等状态。 输入装配器阶段是管道中的一个新阶段,其作业是从内存流式传输到管道中的基元。

若要创建输入布局状态对象,请参阅 CreateInputLayout

光栅器状态

此状态组(见 D3D10_RASTERIZER_DESC)初始化 光栅器阶段。 此对象包括填充或扑杀模式等状态、为剪裁启用剪裁矩形和设置多重采样参数。 此阶段将基元光栅化为像素,执行剪裁和将基元映射到视区等作。

若要创建光栅器状态对象,请参阅 CreateRasterizerState

Depth-Stencil 状态

此状态组(见 D3D10_DEPTH_STENCIL_DESC)初始化 输出合并阶段的深度模具部分。 更具体地说,此对象初始化深度和模具测试。

若要创建深度模具状态对象,请参阅 CreateDepthStencilState

Blend State

此状态组(见 D3D10_BLEND_DESC)初始化 输出合并阶段的混合部分。

若要创建混合状态对象,请参阅 CreateBlendState

采样器状态

此状态组(请参阅 D3D10_SAMPLER_DESC)初始化采样器对象。 着色器阶段使用采样器对象来筛选内存中的纹理。

Direct3D 9 和 Direct3D 10 之间的差异:

  • 在 Direct3D 10 中,采样器对象不再绑定到特定纹理,它只是描述如何在给定任何附加资源的情况下进行筛选。

 

若要创建采样器状态对象,请参阅 CreateSamplerState

性能注意事项

设计 API 以使用状态对象会产生多种性能优势。 这包括在创建对象时验证状态、在硬件中启用状态对象的缓存,以及大大减少状态设置 API 调用期间传递的状态量(通过将句柄传递给状态对象而不是状态)。

若要实现这些性能改进,应在应用程序启动时创建状态对象,且在呈现循环之前。 状态对象是不可变的,即创建状态对象后,无法更改它们。 相反,必须销毁并重新创建它们。 若要应对此限制,最多可以创建每种状态对象的 4096 个。 例如,可以使用各种采样器状态组合创建多个采样器对象。 然后,通过调用相应的 Set API(将句柄传递给对象(而不是采样器状态)来完成更改采样器状态。 这大大减少了每个呈现帧中更改状态的开销量,因为调用数和数据量会大大减少。

或者,可以选择使用效果系统,该系统会自动管理应用程序的高效创建和销毁状态对象。

API 功能(Direct3D 10)