狀態物件 (Direct3D 10)
在 Direct3D 10 中,裝置狀態會分組為狀態物件,大幅降低狀態變更的成本。 有幾個狀態物件,每個設計成針對特定管線階段初始化一組狀態。 您可以為每個狀態物件類型建立最多 4096 個。
輸入配置狀態
這個狀態群組 (會看到 D3D10_INPUT_ELEMENT_DESC) 會指示 輸入組合器階段 如何從輸入緩衝區讀取資料,並將其組合在頂點著色器使用。 這包括狀態,例如輸入緩衝區中的元素數目和輸入資料簽章。 輸入組合器階段是管線中的新階段,其作業是從記憶體將基本類型串流至管線。
若要建立 input-layout-state 物件,請參閱 CreateInputLayout。
轉譯器狀態
此狀態群組 (請參閱 D3D10_RASTERIZER_DESC) 初始化 轉譯器階段。 此物件包含填滿或揀選 (Cull) 模式、啟用剪式矩形裁剪和設定多重樣本參數等狀態。 這個階段會將基本類型點陣化成像素,執行像是裁剪及對應基本類型到檢視區等作業。
若要建立轉譯器狀態物件,請參閱 CreateRasterizerState。
深度樣板狀態
這個狀態群組 (會看到 D3D10_DEPTH_STENCIL_DESC) 初始化 輸出合併階段的深度樣板部分。 更具體而言,這個物件初始化深度和樣板測試。
若要建立深度樣板狀態物件,請參閱 CreateDepthStencilState。
混色狀態
此狀態群組 (請參閱 D3D10_BLEND_DESC) 初始化 輸出合併階段的混合部分。
若要建立 blend-state 物件,請參閱 CreateBlendState。
取樣器狀態
這個狀態群組 (請參閱 D3D10_SAMPLER_DESC) 初始化取樣器物件。 著色器階段使用取樣器物件,以篩選記憶體中的紋理。
Direct3D 9 與 Direct3D 10 之間的差異:
- 在 Direct3D 10 中,取樣器物件不再系結至特定紋理,它只會描述如何在任何附加資源下進行篩選。
若要建立 sampler-state 物件,請參閱 CreateSamplerState。
效能考量
設計 API 以使用狀態物件,會建立許多效能優點。 其中包括在物件建立時驗證狀態,在硬體啟用狀態物件快取,並大幅降低狀態設定 API 呼叫期間傳遞的狀態數量(傳遞狀態物件的控制代碼,而不是狀態)。
若要達成這些效能改進,您應該在應用程式啟動時,在轉譯迴圈之前,建立狀態物件。 狀態物件是不變,也就是狀態物件建立之後便無法變更。 相反地,您必須終結並重新建立它們。 若要處理這項限制,您可以為每個狀態物件類型建立最多 4096 個。 例如,您可以使用各種取樣器狀態組合來建立數個取樣器物件。 然後呼叫適當的 Set API,將控制碼傳遞至物件 (而不是取樣器狀態) 來完成變更取樣器狀態。 這大幅降低變更狀態的每個轉譯畫面期間的額外負荷數量,因為呼叫數目和資料量已大幅降低。
或者,您可以選擇使用效果系統,為您的應用程式自動管理狀態物件的有效建立和解構。
相關主題