D3D10的渲染管線被分成5個(gè)階段(stage),每個(gè)階段都有許多的狀態(tài)(state),不同的狀態(tài)決定了階段的不同特征。當(dāng)渲染不同的物體時(shí),通常需要切換某些個(gè)階段的某些狀態(tài)。在D3D9中,沒(méi)有明顯的階段劃分,所有的狀態(tài)設(shè)置都是直接針對(duì)渲染管線的設(shè)置,比如頂點(diǎn)格式、渲染狀態(tài)、紋理階段狀態(tài)等,程序可以單獨(dú)修改每一個(gè)狀態(tài)。D3D10 用階段狀態(tài)對(duì)象來(lái)包裝一組相關(guān)的狀態(tài)。對(duì)渲染管線的修改只能通過(guò)狀態(tài)對(duì)象來(lái)進(jìn)行,而不能直接修改單個(gè)狀態(tài)。最多可以創(chuàng)建4096個(gè)狀態(tài)對(duì)象,切換狀態(tài)對(duì)象而不是直接修改狀態(tài)能大大減少渲染管線的狀態(tài)切換開(kāi)銷(xiāo)。
狀態(tài)對(duì)象通過(guò)幾個(gè)途徑來(lái)提升性能:在狀態(tài)對(duì)象創(chuàng)建時(shí)進(jìn)行狀態(tài)的驗(yàn)證,可以在硬件中緩存狀態(tài)對(duì)象,減少狀態(tài)切換函數(shù)調(diào)用時(shí)的參數(shù)傳遞。狀態(tài)對(duì)象是不可以修改的,應(yīng)該在程序初始化時(shí)創(chuàng)建所有可能用到的狀態(tài)對(duì)象。或者將狀態(tài)寫(xiě)入到Effect中,Effect系統(tǒng)會(huì)自動(dòng)高效地管理狀態(tài)對(duì)象的創(chuàng)建和銷(xiāo)毀。
輸入布局(Input-Layout)狀態(tài)
輸入布局狀態(tài)決定了輸入集成器(Input Assembler)階段如何解析輸入緩沖中的數(shù)據(jù)。這組狀態(tài)由輸入布局狀態(tài)對(duì)象來(lái)包裝,輸入布局狀態(tài)對(duì)象用 ID3D10InputLayout 接口來(lái)表示,使用 ID3D10Device::CreateInputLayout來(lái)創(chuàng)建,使用ID3D10Device::IASetInputLayout來(lái)應(yīng)用到管線中。
D3D9中使用FVF或者頂點(diǎn)聲明結(jié)構(gòu)來(lái)定義輸入的頂點(diǎn)緩沖格式,D3D10中則使用輸入元素結(jié)構(gòu)(D3D10_INPUT_ELEMENT_DESC)來(lái)定義。這個(gè)結(jié)構(gòu)和頂點(diǎn)聲明結(jié)構(gòu)很類(lèi)似。
光柵器(Rasterizer)狀態(tài)
光柵器狀態(tài)包括填充(fill)模式,精選(cull)模式,裁剪(clipping),多重采樣狀態(tài)等,決定光柵化階段的特征。完整的狀態(tài)列表在D3D10_RASTERIZER_DESC結(jié)構(gòu)中描述。光柵器狀態(tài)對(duì)象用 ID3D10RasterizerState 接口來(lái)表示。使用ID3D10Device::CreateRasterizerState來(lái)創(chuàng)建,使用ID3D10Device::RSSetState來(lái)應(yīng)用到管線中。
深度模版狀態(tài)
深度模版狀態(tài)設(shè)定輸出合并階段是進(jìn)行的深度模版測(cè)試狀態(tài)。這組狀態(tài)用D3D10_DEPTH_STENCIL_DESC結(jié)構(gòu)來(lái)描述。深度模版狀態(tài)對(duì)象用 ID3D10DepthStencilState 接口來(lái)表示。使用ID3D10Device::CreateDepthStencilState來(lái)創(chuàng)建,使用ID3D10Device::OMSetDepthStencilState來(lái)應(yīng)用到管線中。
混合狀態(tài)
設(shè)定輸出合并階段的混合特性。用ID3D10BlendState接口來(lái)表示,用ID3D10Device::CreateBlendState.來(lái)創(chuàng)建,用ID3D10Device::OMSetBlendState來(lái)應(yīng)用。
取樣器狀態(tài)
取樣器對(duì)象用來(lái)在著色器階段對(duì)紋理內(nèi)存進(jìn)行取樣,用D3D10_BLEND_DESC結(jié)構(gòu)來(lái)描述。在D3D10中,取樣器不再和一個(gè)具體的紋理綁定在一起,而是可以對(duì)任意給的紋理進(jìn)行取樣。用ID3D10SamplerState接口來(lái)表示。用ID3D10Device::CreateSamplerState.來(lái)創(chuàng)建。用 ID3D10Device::VSSetSamplers, ID3D10Device::GSSetSamplers, 或 ID3D10Device::PSSetSamplers.來(lái)設(shè)定到某個(gè)著色器階段。