共用方式為


狀態物件 (Direct3D 10)

在 Direct3D 10 中,裝置狀態會分組為狀態物件,大幅降低狀態變更的成本。 有數個狀態物件,每個物件都設計成針對特定管線階段初始化一組狀態。 您可以為每個狀態物件類型建立最多 4096 個。

Input-Layout 狀態

這個狀態群組(請參閱 D3D10_INPUT_ELEMENT_DESC)會指示 輸入組合器階段 如何從輸入緩衝區讀取數據,並將其組合以供頂點著色器使用。 這包括狀態,例如輸入緩衝區中的元素數目和輸入數據的簽章。 輸入組合器階段是管線中的新階段,其作業是從記憶體將基本類型串流至管線。

若要建立 input-layout-state 物件,請參閱 CreateInputLayout

轉譯器狀態

這個狀態群組 (請參閱 D3D10_RASTERIZER_DESC)會初始化 轉譯器階段。 此物件包含像是填滿或 cull 模式、啟用剪刀矩形進行裁剪,以及設定多重取樣參數等狀態。 這個階段會將基本類型點陣化為圖元,並執行裁剪和對應基本類型至檢視區的作業。

若要建立轉譯器狀態物件,請參閱 CreateRasterizerState

Depth-Stencil 狀態

這個狀態群組(請參閱 D3D10_DEPTH_STENCIL_DESC)初始化 輸出合併階段的深度樣板部分。 更具體來說,這個物件會初始化深度和樣板測試。

若要建立深度樣板狀態物件,請參閱 CreateDepthStencilState

Blend State

這個狀態群組(請參閱 D3D10_BLEND_DESC)會初始化 輸出合併階段的混合部分

若要建立 blend-state 物件,請參閱 CreateBlendState

取樣器狀態

這個狀態群組 (請參閱 D3D10_SAMPLER_DESC) 會初始化取樣器物件。 著色器階段會使用取樣器對象來篩選記憶體中的紋理。

Direct3D 9 與 Direct3D 10 之間的差異:

  • 在 Direct3D 10 中,取樣器物件不再系結至特定紋理,它只會描述如何針對任何附加資源執行篩選。

 

若要建立 sampler 狀態物件,請參閱 CreateSamplerState

效能考慮

設計 API 以使用狀態物件會產生數個效能優點。 其中包括在建立對象時驗證狀態、在硬體中啟用狀態物件的快取,以及大幅減少狀態設定 API 呼叫期間傳遞的狀態數量(藉由將句柄傳遞至狀態物件而非狀態)。

若要達到這些效能改善,您應該在應用程式啟動時建立狀態物件,在轉譯迴圈之前也一樣。 狀態物件是不可變的,也就是說,一旦建立它們,就無法變更它們。 相反地,您必須終結並重新建立它們。 為了應付這項限制,您可以建立最多 4096 種類型的狀態物件。 例如,您可以使用各種 sampler 狀態組合來建立數個取樣器物件。 接著,藉由呼叫適當的 Set API,將句柄傳遞至物件(而不是取樣器狀態)來完成變更取樣器狀態。 這可大幅減少每個轉譯框架期間變更狀態的額外負荷,因為呼叫數目和數據量會大幅減少。

或者,您可以選擇使用效果系統,自動管理應用程式狀態物件的有效建立和破壞。

API 功能 (Direct3D 10)