Direct3D 12 保守點陣化

保守點陣化會對圖元轉譯新增一些確定性,這對衝突偵測演算法特別有説明。

概觀

保守點陣化表示轉譯基本類型至少部分涵蓋的所有圖元都會點陣化,這表示會叫用圖元著色器。 正常行為是取樣,如果已啟用「保守點陣化」,則不會使用此行為。

保守點陣化適用于許多情況,包括確定衝突偵測、遮蔽消除和並排轉譯。

例如,下圖顯示使用保守點陣化轉譯的綠色三角形,如同轉譯器 (,也就是使用 16.8 個固定點頂點座標) 。 棕色區域稱為「不確定區域」,這是代表三角形延伸界限的概念區域,需要確保轉譯器中的基本類型相對於原始浮點頂點座標而言是保守的。 每個頂點的紅色方塊會示範如何計算不確定區域:作為掃掠方塊。

大型灰色方形會顯示將轉譯的圖元。 粉紅色方塊會顯示使用「左上方規則」轉譯的圖元,當三角形的邊緣與圖元的邊緣交叉時,就會開始作用。 (圖元集可能有誤判,不應該) 系統通常會執行,但不一定是 cull。

左上方規則

與管線的互動

點陣化規則互動

在保守點陣化模式中,點陣化規則套用的方式與未啟用保守點陣化模式的方式相同,但上述Top-Left規則除外,以及圖元涵蓋範圍。 必須使用 16.8 Fixed-Point轉譯器精確度。

如果硬體使用完整的浮點頂點座標,則不會涵蓋的圖元,只有在固定點定義域中沒有較大的一半圖元時,才會包含在不確定區域內。 未來硬體預期會達到第 2 層中指定的強化不確定區域。 請注意,此需求會防止斜條三角形進一步延伸至所需的範圍。

同樣地,也會套用 InnerCoverage 類似的有效不確定區域,但較嚴格,因為此案例不需要較大的不確定區域。 如需詳細資訊,請參閱 InnerCoverage 互動

內部和外部不確定區域必須大於或等於固定點網域中子圖元格線或圖元的 1/512 大小。 這是最小的有效不確定區域。 1/512 來自 16.8 固定點轉譯器座標表示,以及將浮點頂點頂點座標轉換成 16.8 固定點座標時所套用的圓角到最接近的規則。 如果轉譯器精確度變更,則 1/512 可能會變更。 如果實作實作此最小不確定區域,則當不確定區域的邊緣或角落落在圖元邊緣或角落時,它們必須遵循Top-Left規則。 不確定區域的裁剪邊緣應該視為最接近的頂點,這表示其計數為兩個邊緣:關聯頂點的兩個聯結。 使用最小不確定區域時,需要Top-Left規則,因為如果沒有,則保守點陣化實作將無法點陣化圖元,而當停用保守點陣化模式時,可能會涵蓋的圖元。

下圖說明透過在固定點定義域中基本邊緣四周掃掠平方所產生的有效外部不確定區域 (,也就是頂點已由 16.8 固定點標記法量化) 。 此平方的維度是以有效的外部不確定區域大小為基礎:針對圖元的 1/2,方形為 1 圖元,高度為 1 圖元,圖元的 1/512,平方為寬度和高度的圖元 1/256。 綠色三角形代表指定的基本類型,紅色虛線代表超出估計的保守點陣化上的界限,實心黑色方塊代表沿著基本邊緣掃掠的方形,而藍色複選區域是外部不確定區域:

外部不確定區域。

多重取樣互動

不論RenderTarget/DepthStencil表面 (的樣本數目,還是使用 ForcedSampleCount) ,所有樣本都會由保守點陣化來涵蓋圖元點陣化。 個別範例位置不會測試它們是否落在基本類型中。

SampleMask 互動

SampleMask轉譯器狀態套用的方式與未針對 InputCoverage 啟用保守點陣化時一樣,但不會影響 InnerCoverage (亦即,它不是 AND 會套用至使用 InnerCoverage) 宣告的輸入。 這是因為 InnerCoverage 與 MSAA 樣本是否遮罩不相關:0 InnerCoverage 只表示不保證完全涵蓋圖元,而不是不會更新任何樣本。

深度/樣板測試互動

深度/樣板測試會以與未啟用保守點陣化時涵蓋所有樣本的方式一樣,繼續進行保守點陣化圖元。

繼續進行涵蓋的所有樣本可能會導致深度推斷有效,而且必須在未啟用保守點陣化時限制在檢視區中。 這類似于在取樣計數大於 1 的 RenderTarget 上使用圖元頻率插補模式時,雖然在保守點陣化的情況下,它是進入可推斷之固定函式深度測試的深度值。

未定義深度推斷的早期深度擷取行為。 這是因為某些早期深度清除硬體無法正確支援推斷的深度值。 不過,即使硬體可以支援推斷深度值,早期深度推算行為仍有問題。 此問題可藉由將圖元著色器輸入深度固定到要點陣化的基本和最大深度值,並將該值 oDepth 寫入圖元著色器輸出深度暫存器 () 來解決此問題。 在此案例中,需要實作才能停用早期深度清除,因為寫入。 oDepth

協助程式圖元互動

協助程式圖元規則會套用與未啟用保守點陣化時相同的方式。 在此過程中,包括協助程式圖元在內的所有圖元都必須如互動區段中所指定 InputCoverage 正確報告 InputCoverage 。 因此,完全未涵蓋的圖元報表 0 涵蓋範圍。

輸出涵蓋範圍互動

輸出涵蓋範圍 (oMask) 對於保守點陣化圖元的行為,如同在未啟用「保守點陣化」時未啟用所有涵蓋樣本時一樣。

InputCoverage 互動

在保守點陣化模式中,此輸入暫存器會填入,就如同未針對指定的保守點陣化圖元啟用保守點陣化時涵蓋所有樣本一樣。 也就是說,所有現有的互動都會套用 (例如 SampleMask) 套用,而 LSB 中的 InputCoverage 前 n 個位會針對保守點陣化圖元設定為 1,指定每個圖元 RenderTarget 和/或 DepthStencil 緩衝區系結在 輸出合併的 n 個樣本,或 n 個範例 ForcedSampleCount。 其餘的位為 0。

無論使用保守點陣化,此輸入都可以在著色器中使用,但保守點陣化會變更其行為,只顯示協助程式圖元) 涵蓋的所有範例 (或無。

InnerCoverage 互動

這項功能是由第 3 層提供,且僅適用于第 3 層。 當實作支援第 3 層以下的層時,執行時間會讓著色器建立失敗,而著色器會使用此模式。

圖元著色器有可用的 32 位純量整數系統產生值: InnerCoverage 。 這是一個位欄位,從 LSB 設定為 1 的位欄位,只針對指定的保守點陣化圖元設定為 1,只有當該圖元保證完全位於目前的基本類型內時。 未設定位 0 時,所有其他輸入暫存器位都必須設定為 0,但在位 0 設定為 1 (基本上未定義,此位欄位代表布林值,其中 false 必須剛好為 0,但 true 可以是任何奇數 (亦即位 0 設定) 非零值) 。 此輸入用於被忽略的保守點陣化資訊。 它會通知圖元著色器目前圖元是否完全位於幾何內部。

這必須考慮在解析度大於或等於目前 Draw 運作的解析度時貼齊錯誤。 當圖元未完全涵蓋解析度大於或等於目前 Draw 運作) 的解析度時,不得有誤判 (設定 InnerCoverage 位,但允許誤判。 總而言之,實作不能不正確地將圖元識別為完全涵蓋,而不會在轉譯器中具有完整浮點頂點座標。

如果硬體使用完整浮點頂點座標,則完全涵蓋的圖元,只有在它們與內部不確定區域相交時,才可能省略,這必須不超過子圖元格線的大小,或固定點定義域中的 1/256 圖元大小。 另一種方式是,完全在內部不確定區域的內部界限內圖元必須標示為完全涵蓋。 不確定區域的內部界限會以粗體黑色虛線說明于下圖中。 1/256 來自 16.8 固定點轉譯器座標標記法,如果轉譯器精確度變更,可能會變更。 此不確定區域足以考慮將浮點頂點座標轉換成轉譯器中固定點頂點座標所造成的貼齊錯誤。

點陣化規則互動中定義的相同 1/512 最小不確定區域需求也適用于這裡。

下圖說明一個有效的內部不確定區域,其產生方式是將固定點定義域中基本類型邊緣四周的方形掃掠 (,也就是頂點已由 16.8 固定點標記法量化) 。 此方塊的維度是以有效的內部不確定區域大小為基礎:針對圖元的 1/256,方形為寬度和高度的圖元 1/128。 綠色三角形代表指定的基本類型、粗體黑色虛線代表內部不確定區域的界限、實心黑色方塊代表沿著基本邊緣掃掠的方形,而橙色檢查區域則是內部不確定區域:

內部不確定性。

的使用 InnerCoverage 並不會影響圖元是否以保守方式點陣化,亦即,使用其中 InputCoverage 一種模式不會影響啟用「保守點陣化」模式時要點陣化的圖元。 因此,使用 InnerCoverage 時,且圖元著色器正在處理幾何值未完全涵蓋的圖元將會是 0,但圖元著色器調用將會更新樣本。 這與當 為 0 時 InputCoverage 不同,這表示不會更新任何範例。

此輸入與 互斥 InputCoverage :兩者都無法使用。

若要存取 InnerCoverage ,它必須宣告為其中一個圖元著色器輸入暫存器中的單一元件。 宣告上的插補模式必須是常數, (插補點不適用於) 。

InnerCoverage 欄位不會受到深度/樣板測試的影響,也不會受到 SampleMask 點陣化程式狀態的 ANDed。

此輸入只有在保守點陣化模式中才有效。 未啟用「保守點陣化」時, InnerCoverage 會產生未定義的值。

由於協助程式圖元的需求所造成的圖元著色器調用,但基本類型未涵蓋,則必須將 InnerCoverage 暫存器設定為 0。

屬性插補互動

屬性插補模式不會變更,而且繼續的方式與未啟用「保守點陣化」相同,其中會使用檢視區縮放和固定點轉換頂點。 由於會考慮涵蓋保守點陣化圖元中的所有樣本,因此對於要推斷的值而言是有效的,類似于在具有樣本計數大於 1 的 RenderTarget 上使用圖元頻率插補模式時。 距心插補點模式會產生與對應非心心插補模式相同的結果;心心的概念在此案例中是無意義的,其中樣本涵蓋範圍只有完整或 0。

保守的點陣化可讓變質三角形產生圖元著色器調用,因此,變質三角形必須使用指派給 Vertex 0 的值做為所有插補值。

裁剪互動

當啟用「保守點陣化模式」且深度剪輯停用 (當 DepthClipEnable 點陣化狀態設定為 FALSE) 時,基本類型區段的屬性插補可能會有差異,這些區段落在 0 < = z < = w 範圍之外,視實作而定:基本類型與相關平面交集的點使用兩個常數值 (接近或遠) , 或屬性插補行為如同停用「保守點陣化」模式時。 不過,不論保守點陣化模式為何,深度值行為都相同,亦即落在深度範圍外部的基本類型仍必須獲得檢視區深度範圍最接近限制的值。 0 < = z < = w 範圍內的屬性插補行為必須保持不變。

剪輯距離互動

當啟用保守點陣化模式時,剪輯距離有效,而且對於保守點陣化圖元的行為,如同未啟用保守點陣化時所涵蓋的所有樣本一樣。

請注意,保守點陣化可能會導致 W 頂點座標的外推,這可能會導致 W < = 0。 這可能會導致每個圖元的剪輯距離實作在已除以無效 W 值的裁剪距離上運作。 裁剪距離實作必須針對頂點座標 W < = 0 (的圖元叫用點陣化防護,例如,在保守點陣化模式) 時發生外推。

目標獨立點陣化互動

保守的點陣化模式與目標獨立點陣化相容, () 。 套用了一些集區規則和限制,對於保守的點陣化圖元而言,就像涵蓋所有樣本一樣。

IA 基本拓撲互動

未針對線條或點基本類型定義保守點陣化。 因此,指定點或線條的基本拓撲會在啟用「保守點陣化」時提供給點陣化單位時產生未定義的行為。

偵錯層驗證會驗證應用程式不會使用這些基本拓撲。

查詢互動

對於保守的點陣化圖元,當涵蓋所有樣本時,查詢的行為就像是未啟用「保守點陣化」一樣。 例如,針對保守的點陣化圖元,D3D12_QUERY_TYPE_OCCLUSION和D3D12_QUERY_TYPE_PIPELINE_STATISTICS (來自 D3D12_QUERY_TYPE) 在涵蓋所有樣本時未啟用「保守點陣化」時的行為必須像這樣。

圖元著色器叫用應該會針對保守點陣化模式中每一個保守點陣化圖元遞增。

Cull 狀態互動

所有 Cull 狀態在保守點陣化模式中都有效,並遵循與未啟用保守點陣化時相同的規則。

比較不同解析度的保守點陣化與本身或未啟用保守點陣化時,可能會有一些基本類型不相符的面向 (亦即,一個向後,另一個正面) 。 應用程式可以使用D3D12_CULL_MODE_NONE (從 D3D12_CULL_MODE) ,而不使用系統產生的值來 IsFrontFace 避免這種不確定。

IsFrontFace 互動

系統 IsFrontFace 產生的值在保守點陣化模式中有效,並遵循未啟用「保守點陣化」時所定義的行為。

填滿模式互動

保守點陣化的唯一有效 D3D12_FILL_MODE 是D3D12_FILL_SOLID,任何其他填滿模式都是點陣化狀態的無效參數。

這是因為 D3D12 功能規格指定線框填滿模式應該將三角形邊緣轉換成線條,並遵循線條點陣化規則和保守的線條點陣化行為尚未定義。

實作詳細資料

Direct3D 12 中支援的點陣化類型有時稱為「過度擷取的保守點陣化」。 另外還有「小寫的保守點陣化」概念,這表示只有轉譯基本類型完全涵蓋的圖元會點陣化。 透過使用輸入涵蓋範圍資料透過圖元著色器取得低度保守點陣化資訊,而且只有過度擷取的保守點陣化可作為點陣化模式。

如果基本類型的任何部分與圖元重迭,則會將該圖元視為涵蓋,然後進行點陣化。 當基本專案的邊緣或角落落在圖元的邊緣或角落時,「左上角規則」的應用程式是實作特定的。 不過,對於支援變質三角形的實作,邊緣或角落的變質三角形必須至少涵蓋一個圖元。

保守的點陣化實作可能會因不同的硬體而有所不同,而且會產生誤判,這表示它們可能會不正確地決定所涵蓋的圖元。 這可能是因為實作特定的詳細資料,例如在點陣化中使用的固定點頂點座標固有的基本成長或貼齊錯誤。 對於固定點頂點) 座標而言,誤判 (是有效的原因是需要有一些誤判,才能對貼齊頂點進行涵蓋範圍評估 (,也就是已從浮點轉換成點陣化) 中使用的 16.8 固定點的頂點,但接受原始浮點頂點座標所產生的涵蓋範圍。

保守的點陣化實作不會針對非貼齊後基本類型產生浮點頂點座標產生誤判:如果基本類型的任何部分與圖元的任何部分重迭,則該圖元會點陣化。

在索引緩衝區或 3D) 中的重複索引 (重複索引的三角形,或在點陣化) 中的定點 (轉換後變成變質,或可能會在點陣化) 中的共弦頂點之後變成變質;兩者都是有效的行為。 變質的三角形必須視為反向,因此,如果應用程式需要特定行為,它可以使用正面反面擷取或測試。 三角形會針對所有插補值使用指派給 Vertex 0 的值。

除了硬體不支援這項功能的可能性之外,還有三層的硬體支援。

  • 第 1 層會強制執行最多 1/2 圖元的不確定區域,且不支援貼齊後變質。 這適用于磚轉譯、紋理圖集、光線地圖產生和子圖元陰影地圖。
  • 第 2 層會將不確定區域上限減少為 1/256,而且不需要擷取貼齊後變質。 此層對於 CPU 型演算法加速 (很有説明,例如體素化) 。
  • 第 3 層會維持最多 1/256 的不確定區域,並新增內部輸入涵蓋範圍的支援。 內部輸入涵蓋範圍會將新值 SV_InnerCoverage 新增至高階網底語言 (HLSL) 。 這是 32 位純量整數,可在圖元著色器的輸入上指定,並代表 (,也就是圖元是否保證完全涵蓋) 。 此層有助於遮蔽消除。

API summary

下列方法、結構、列舉和協助程式類別參考「保守點陣化」:

DirectX 進階學習影片教學課程:保守點陣化

點陣化排序檢視

轉譯