D3D10的渲染管线被分成5个阶段(stage),每个阶段都有许多的状态(state),不同的状态决定了阶段的不同特征。当渲染不同的物体时,通常需要切换某些个阶段的某些状态。在D3D9中,没有明显的阶段划分,所有的状态设置都是直接针对渲染管线的设置,比如顶点格式、渲染状态、纹理阶段状态等,程序可以单独修改每一个状态。D3D10 用阶段状态对象来包装一组相关的状态。对渲染管线的修改只能通过状态对象来进行,而不能直接修改单个状态。最多可以创建4096个状态对象,切换状态对象而不是直接修改状态能大大减少渲染管线的状态切换开销。
状态对象通过几个途径来提升性能:在状态对象创建时进行状态的验证,可以在硬件中缓存状态对象,减少状态切换函数调用时的参数传递。状态对象是不可以修改的,应该在程序初始化时创建所有可能用到的状态对象。或者将状态写入到Effect中,Effect系统会自动高效地管理状态对象的创建和销毁。
输入布局(Input-Layout)状态
输入布局状态决定了输入集成器(Input Assembler)阶段如何解析输入缓冲中的数据。这组状态由输入布局状态对象来包装,输入布局状态对象用 ID3D10InputLayout 接口来表示,使用 ID3D10Device::CreateInputLayout来创建,使用ID3D10Device::IASetInputLayout来应用到管线中。
D3D9中使用FVF或者顶点声明结构来定义输入的顶点缓冲格式,D3D10中则使用输入元素结构(D3D10_INPUT_ELEMENT_DESC)来定义。这个结构和顶点声明结构很类似。
光栅器(Rasterizer)状态
光栅器状态包括填充(fill)模式,精选(cull)模式,裁剪(clipping),多重采样状态等,决定光栅化阶段的特征。完整的状态列表在D3D10_RASTERIZER_DESC结构中描述。光栅器状态对象用 ID3D10RasterizerState 接口来表示。使用ID3D10Device::CreateRasterizerState来创建,使用ID3D10Device::RSSetState来应用到管线中。
深度模版状态
深度模版状态设定输出合并阶段是进行的深度模版测试状态。这组状态用D3D10_DEPTH_STENCIL_DESC结构来描述。深度模版状态对象用 ID3D10DepthStencilState 接口来表示。使用ID3D10Device::CreateDepthStencilState来创建,使用ID3D10Device::OMSetDepthStencilState来应用到管线中。
混合状态
设定输出合并阶段的混合特性。用ID3D10BlendState接口来表示,用ID3D10Device::CreateBlendState.来创建,用ID3D10Device::OMSetBlendState来应用。
取样器状态
取样器对象用来在着色器阶段对纹理内存进行取样,用D3D10_BLEND_DESC结构来描述。在D3D10中,取样器不再和一个具体的纹理绑定在一起,而是可以对任意给的纹理进行取样。用ID3D10SamplerState接口来表示。用ID3D10Device::CreateSamplerState.来创建。用 ID3D10Device::VSSetSamplers, ID3D10Device::GSSetSamplers, 或 ID3D10Device::PSSetSamplers.来设定到某个着色器阶段。