在 Direct3D 12 中管理圖形管線狀態

本主題描述如何在 Direct3D 12 中設定圖形管線狀態。

管線狀態概觀

將幾何提交至圖形處理單位 (GPU) 繪製時,有各種不同的硬體設定可決定輸入資料如何解譯和轉譯。 這些設定統稱為圖形管線狀態,並包含一般設定,例如點陣化狀態、混合狀態和深度樣板狀態,以及提交幾何的基本拓撲類型,以及將用於轉譯的著色器。 在 Microsoft Direct3D 12 中,大部分的圖形管線狀態都是使用管線狀態物件來設定, (PSO) 。 應用程式可以建立不限數目的這些物件,這些物件由 ID3D12PipelineState 介面表示,通常是在初始化階段。 然後,在轉譯時間,命令清單可以在直接命令清單中呼叫 ID3D12GraphicsCommandList::SetPipelineState 來快速切換管線狀態的多個設定,或組合以設定使用中的 PSO。

在 Direct3D 11 中,圖形管線狀態已組合成大型、粗細的狀態物件,例如 ID3D11BlendState ,可在即時內容中建立和設定,其方法如下: ID3D11DeviceCoNtext::OMSetBlendState。 這背後的概念是 GPU 可以藉由設定相關的設定來提升效率,例如混合狀態設定一次。 不過,使用現今的圖形硬體時,不同硬體單位之間會有相依性。 例如,硬體混合狀態可能會相依于點陣狀態和混合狀態。 Direct3D 12 中的 PSO 是設計成允許 GPU 預先處理每個管線狀態中的所有相依設定,通常是在初始化期間,以盡可能有效率地在轉譯時間切換狀態。

請注意,雖然大部分的管線狀態設定都是使用 PSO 來設定,但有些狀態設定是使用 ID3D12GraphicsCommandList所提供的 API 個別設定。 以下會詳細討論這些設定和相關聯的 API。 此外,圖形管線狀態的繼承方式有差異,並保存自直接命令清單和套件組合。 本主題提供以下這兩項的詳細資料。

使用管線狀態物件設定的圖形管線狀態

查看可以使用管線狀態物件設定之所有不同管線狀態的最簡單方式,就是查看您在初始化物件時傳遞至ID3D12Device::CreateGraphicsPipelineStateD3D12_GRAPHICS_PIPELINE_STATE_DESC參考主題。 可設定狀態的快速摘要包括:

  • 所有著色器的位元組程式碼,包括頂點、圖元、網域、殼層和幾何著色器。
  • 輸入頂點格式。
  • 基本拓撲類型。 請注意,輸入組合器基本拓撲類型 (點、線條、三角形、修補) 是使用 D3D12_PRIMITIVE_TOPOLOGY_TYPE 列舉在 PSO 內設定。 使用 ID3D12GraphicsCommandList::IASetPrimitiveTopology 方法,從命令清單中設定基本相鄰和排序 (行清單、線條帶、具有相鄰資料等等) 。
  • 混合狀態、點陣化狀態、深度樣板狀態。
  • 深度樣板和轉譯目標格式,以及轉譯目標計數。
  • 多重取樣參數。
  • 串流輸出緩衝區。
  • 根簽章。 如需詳細資訊,請參閱 根簽章

在管線狀態物件外部設定的圖形管線狀態

大部分的圖形管線狀態都是使用 PSO 來設定。 不過,從命令清單中呼叫 ID3D12GraphicsCommandList 介面的方法,可設定一組管線狀態參數。 下表顯示以這種方式設定的狀態和對應的方法。

狀態 方法
資源系結 IASetIndexBuffer
IASetVertexBuffers
SOSetTargets
OMSetRenderTargets
SetDescriptorHeaps
所有 SetGraphicsRoot... 方法
所有 SetComputeRoot... 方法
檢視區 RSSetViewports
Scissor rects RSSetScissorRects
Blend Factor OMSetBlendFactor
深度樣板參考值 OMSetStencilRef
輸入組合器基本拓撲順序和相鄰類型 IASetPrimitiveTopology

圖形管線狀態繼承

由於直接命令清單通常適用于一次一次使用,且套件組合會同時使用多次,因此有不同規則說明它們如何繼承先前命令清單或套件組合所設定的圖形管線狀態。

針對使用 PSO 設定的圖形管線狀態,這些狀態都不會由直接命令清單或套件組合繼承。 直接命令清單和套件組合的初始圖形管線狀態會在建立時,使用 ID3D12PipelineState 參數設定為 ID3D12Device::CreateCommandList。 如果未在呼叫中指定 PSO,則會使用預設的初始狀態。 您可以呼叫 ID3D12GraphicsCommandList::SetPipelineState,在命令清單中變更目前的 PSO。

直接命令清單也不會繼承以 RSSetViewports之類的命令清單方法設定的狀態。 如需非 PSO 狀態的預設初始值詳細資訊,請參閱 ID3D12GraphicsCommandList::ClearState

套件組合會繼承未設定為基本拓撲類型以外的所有圖形管線狀態。 基本拓撲一律會在套件組合開始執行時設定為 D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED 。 在套件組合內設定的任何狀態 (PSO 本身、非 PSO 型狀態和資源系結,) 會影響其父直接命令清單的狀態。 例如,如果 RSSetViewports 是從套件組合內呼叫,則指定的檢視區會繼續在父直接命令清單中設定,以便在設定檢視區的 ExecuteBundle 呼叫之後呼叫。

在命令清單或配套內設定的資源系結會保存。 因此,在直接命令清單中修改的資源系結仍會在後續的子系組合執行中設定。 而且從套件組合內修改的資源系結仍會針對父直接命令清單中的後續呼叫進行設定。

如需系結的詳細資訊,請參閱使用根簽章套件組合語意一節。