狀態物件 (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,將句柄傳遞至物件(而不是取樣器狀態)來完成變更取樣器狀態。 這可大幅減少每個轉譯框架期間變更狀態的額外負荷,因為呼叫數目和數據量會大幅減少。
或者,您可以選擇使用效果系統,自動管理應用程式狀態物件的有效建立和破壞。
相關主題