状态对象 (Direct3D 10)

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

输入布局状态

这组状态 (看到 D3D10_INPUT_ELEMENT_DESC) 指示 输入装配器阶段 如何从输入缓冲区中读取数据并将其组合起来供顶点着色器使用。 其中包括输入缓冲区的元素数量以及输入数据的签名等状态。 输入汇编程序阶段是管道中的一个新阶段,其作业是将基元从内存流式传输到管道中。

若要创建 input-layout-state 对象,请参阅 CreateInputLayout

光栅器状态

这组状态 (看到 D3D10_RASTERIZER_DESC) 初始化 光栅器阶段。 此对象包括填充或精选模式等状态,让剪刀矩形能够剪切和设置多重采样参数。 此阶段可将基元光栅化为像素,执行相关操作,例如将基元剪切并映射至视区。

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

深度模具状态

这组状态 (看到 D3D10_DEPTH_STENCIL_DESC) 初始化 输出合并阶段的深度模具部分。 具体而言,此对象可初始化深度和模具测试。

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

混合状态

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

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

采样器状态

这组状态 (看到 D3D10_SAMPLER_DESC) 初始化采样器对象。 着色器阶段使用取样器对象筛选内存中的纹理。

Direct3D 9 与 Direct3D 10 之间的差异:

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

 

若要创建 sampler-state 对象,请参阅 CreateSamplerState

性能注意事项

设计 API 使用状态对象可带来多项性能优势。 其中包括验证对象创建时的状态、实现状态对象在硬件中的缓存以及显著减少在状态设置 API 调用(将图柄传递至状态对象,而不是状态)时通过的状态量。

为了实现这些性能改进,应用程序启动时,应在呈现循环之前创建状态对象。 状态对象不可变,也就是说在创建后,你无法对其进行更改。 必须将其销毁并重新创建。 为了应对此限制,可以创建每种类型的状态对象最多 4096 个。 例如,可以使用各种采样器状态组合创建多个采样器对象。 然后通过调用相应的 Set API 来完成采样器状态的更改,该 API 将句柄传递给对象 (,而不是) 采样器状态。 由于调用数量和数据量大大减少,因此,这能够显著降低每一个状态更改渲染帧期间的间接成本。

或者,你也可以选择使用效果系统,它能够自动管理应用程序状态对象的有效创建和销毁。

Direct3D 10) (API 功能