状态对象 (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 将句柄传递给对象 (,而不是) 采样器状态。 由于调用数量和数据量大大减少,因此,这能够显著降低每一个状态更改渲染帧期间的间接成本。
或者,你也可以选择使用效果系统,它能够自动管理应用程序状态对象的有效创建和销毁。
相关主题