Output-Merger 階段
輸出合併 (OM) 階段會使用管線狀態的組合、圖元著色器所產生的圖元數據、轉譯目標的內容,以及深度/樣板緩衝區的內容,來產生最終轉譯的圖元色彩。 OM 階段是判斷哪些像素可見的最後一個步驟(具有深度樣板測試),以及混合最終圖元色彩。
Direct3D 9 與 Direct3D 10 之間的差異:
- Direct3D 9 會實作 Alpha 測試(使用 alpha 測試狀態),以控制圖元是否寫入輸出轉譯目標。
- Direct3D 10 和更新版本不會實作 Alpha 測試(或 Alpha 測試狀態)。 這可以使用圖元著色器或深度/樣板功能來控制。
Depth-Stencil 測試概觀
建立為紋理資源的深度樣板緩衝區可以同時包含深度數據和樣板數據。 深度數據可用來判斷相機最接近的圖元,而樣板數據則用來遮罩可更新的圖元。 最後,輸出合併階段會使用深度和樣板值數據來判斷是否應該繪製圖元。 下圖概念上顯示深度樣板測試的完成方式。
若要設定深度樣板測試,請參閱 設定 Depth-Stencil 功能。 深度樣板物件會封裝深度樣板狀態。 應用程式可以指定深度樣板狀態,或 OM 階段會使用預設值。 如果停用多重取樣,混合作業會以每像素為基礎執行。 如果已啟用多重取樣,則混合會以每個多重取樣為基礎進行。
使用深度緩衝區來判斷應該繪製的圖元的程序稱為深度緩衝處理,有時也稱為 z 緩衝處理。
一旦深度值到達輸出合併階段(無論是從插補或來自圖元著色器),它們一律會固定:z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z))根據深度緩衝區的格式/精確度,使用浮點規則。 在固定之後,深度值會與現有的深度緩衝區值進行比較(使用 DepthFunc)。 如果沒有系結深度緩衝區,深度測試一律會通過。
如果深度緩衝區格式中沒有樣板元件,或沒有深度緩衝區系結,則樣板測試一律會通過。 否則,功能會與 Direct3D 9 保持不變。
一次只能有一個深度/樣板緩衝區作用中:任何系結的資源檢視都必須符合深度/樣板檢視的 (大小和維度相同)。 這並不表示資源大小必須相符,只是檢視大小必須相符。
如需深度樣板測試的詳細資訊,請參閱 教學課程 14。
混合概觀
混合會結合一或多個像素值來建立最終圖元色彩。 下圖顯示混合像素數據所涉及的程式。
混合數據運作方式的
就概念上講,您可以將此流程圖可視化,在輸出合併階段中實作兩次:第一個流程圖會混合 RGB 數據,同時第二個混合 Alpha 數據。 若要檢視如何使用 API 來建立和設定混合狀態,請參閱 設定混合功能。
固定函式混合可以針對每個轉譯目標獨立啟用。 不過,只有一組混合控件,因此相同的混合會套用至已啟用混合的所有 RenderTargets。 混合值(包括 BlendFactor)在混合之前一律會夾在轉譯目標格式的範圍。 每個轉譯目標會進行限制,並遵循轉譯目標類型。 唯一的例外狀況是 float16、float11 或 float10 格式,這些格式沒有固定,因此,這些格式上的混合作業可以至少與輸出格式相同的有效位數/範圍來完成。 NaN 和帶正負號的零會針對所有案例傳播(包括0.0混合權數)。
當您使用 sRGB 轉譯目標時,運行時間會在執行混合之前,將轉譯目標色彩轉換成線性空間。 運行時間會將最終混合值轉換成 sRGB 空間,再將值儲存迴轉譯目標。
Direct3D 9 與 Direct3D 10 之間的差異:
- 在 Direct3D 9 中,可以針對每個轉譯目標獨立啟用固定函式混合。
- 在 Direct3D 10 和更新版本中,有一個混合狀態描述;因此,可以為所有轉譯目標設定一個混合值。
Dual-Source 色彩混合
這項功能可讓輸出合併階段同時使用圖元著色器輸出 (o0 和 o1) 作為混合作業的輸入,並將單一轉譯目標設為位置 0。 有效的混合作業包括:add、subtract 和 revsubtract。 SrcBlend、DestBlend、SrcBlendAlpha 或 DestBlendAlpha 的有效混合選項包括:D3D11_BLEND_SRC1_COLOR、D3D11_BLEND_INV_SRC1_COLOR、D3D11_BLEND_SRC1_ALPHA、D3D11_BLEND_INV_SRC1_ALPHA。 混合方程式與輸出寫入遮罩會指定圖元著色器輸出的元件。 會忽略額外的元件。
寫入至其他圖元著色器輸出 (o2、 o3 等) 未定義;如果轉譯目標未系結至位置 0,則可能不會寫入轉譯目標。 撰寫 oDepth 在雙來源色彩混合期間有效。
如需範例,請參閱 混合圖元著色器輸出。
多個 RenderTargets 概觀
圖元著色器可以用來轉譯為至少 8 個不同的轉譯目標,所有這些目標都必須是相同的類型(buffer、Texture1D、Texture1DArray 等等)。 此外,所有轉譯目標在所有維度中都必須有相同的大小(寬度、高度、深度、數位大小、樣本計數)。 每個轉譯目標可能有不同的數據格式。
您可以使用轉譯目標位置的任何組合(最多 8 個)。 不過,資源檢視無法同時系結至多個轉譯目標位置。 只要資源未同時使用,就可以重複使用檢視。
Output-Write 遮罩概觀
使用輸出寫入遮罩來控制可以寫入轉譯目標的數據(每個元件)。
範例遮罩概觀
範例遮罩是 32 位多重取樣涵蓋範圍遮罩,可決定在作用中轉譯目標中更新哪些樣本。 只允許一個範例遮罩。 用戶定義範例遮罩中位與資源中範例的對應。 針對 n 樣本轉譯,會使用樣本遮罩的前 n 個位(來自 LSB)(32 位是最大位數)。
在本節中
主題 | 描述 |
---|---|
設定 Depth-Stencil 功能 |
本節涵蓋設定深度樣板緩衝區的步驟,以及輸出合併階段的深度樣板狀態。 |
設定混合功能 |
混合作業會在將輸出值寫入轉譯目標之前,在每個圖元著色器輸出 (RGBA 值) 上執行。 如果已啟用多重取樣,則會在每個多重取樣上完成混合;否則,會在每個像素上執行混合。 |
深度偏差 |
在 3D 空間中共同平面的多邊形,可以藉由將 z 偏差(或深度偏差)新增至每一個多邊形,使其看起來像不是共同平面。 |