Direct3D 12 保守點陣化
保守的點陣化會對像素轉譯新增一些確定性,這對衝突偵測算法特別有説明。
概述
保守點陣化表示轉譯基本類型至少部分覆蓋的所有圖元都會點陣化,這表示會叫用圖元著色器。 一般行為是取樣,如果已啟用保守點陣化,則不會使用此行為。
保守點陣化在一些情況下很有用,包括在碰撞偵測、遮蔽撲殺和並排轉譯方面具有確定性。
例如,下圖顯示使用保守點陣化轉譯的綠色三角形,如同轉譯器中所示(也就是使用 16.8 固定點頂點座標)。 棕色區域被稱為「不確定性區域」,這是一個概念區域,代表三角形的延伸界限,需要確保轉譯器中的基本類型相對於原始浮點頂點座標而言是保守的。 每個頂點的紅色方塊會顯示不確定性區域的計算方式:以橫掃方塊的形式計算。
大型灰色方塊會顯示將轉譯的圖元。 粉紅色方塊會顯示使用 「Top-Left Rule」 轉譯的圖元,當三角形的邊緣越過像素邊緣時,它就會發揮作用。 系統通常會有誤判(不應該設定的圖元集),但並非一律會擷取。
與管線的互動
點陣化規則互動
在保守點陣化模式中,點陣化規則會套用與未啟用保守派點陣化模式的方式相同,但上述 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'ed 到以 InnerCoverage
宣告的輸入)。 這是因為 InnerCoverage
與 MSAA 樣本是否遮罩無關:0 InnerCoverage
只表示無法完全涵蓋圖元,而不會更新任何樣本。
深度/樣板測試互動
深度/樣板測試會以保守點陣化圖元的方式進行,就像未啟用保守點陣化時涵蓋所有樣本一樣。
繼續進行涵蓋的所有樣本可能會導致深度外推,這是有效的,而且必須在未啟用保守點陣化時,限制在檢視區中。 這類似於在 RenderTarget 上使用圖元頻率插補模式時, 樣本計數大於 1,不過在保守派點陣化的情況下,它是進入可推斷之固定函式深度測試的深度值。
未定義深度推斷的早期深度撲殺行為。 這是因為某些早期深度清除硬體無法正確支援推斷的深度值。 不過,在深度推斷存在的情況下早期深度消除行為,即使硬體可以支援推斷深度值,也會有問題。 此問題可藉由將圖元著色器輸入深度夾住到要點陣化之基本類型的最小和最大深度值,並將該值寫入至 oDepth
(圖元著色器輸出深度快取器)。 由於 oDepth
寫入,因此需要實作才能在此案例中停用早期深度撲殺。
協助程式圖元互動
協助程式圖元規則會套用與未啟用保守派點陣化時相同的方式。 為此,包括協助程式像素在內的所有像素都必須如 InputCoverage
互動區段中所指定正確報告 InputCoverage
。 因此,完全未涵蓋的像素報告0涵蓋範圍。
輸出涵蓋範圍互動
輸出涵蓋範圍(oMask
)的行為是保守點陣化圖元,就像未啟用保守點陣化時所涵蓋的所有樣本一樣。
InputCoverage 互動
在保守點陣化模式中,此輸入緩存器會填入,就好像在未針對指定的保守點陣化圖元啟用保守點陣化時涵蓋所有樣本一樣。 也就是說,所有現有的互動都適用(例如 會套用 SampleMask),而且 LSB InputCoverage
中的前 n 個位會針對保守的點陣化圖元設定為 1,假設在 RenderTarget 和/或 DepthStencil緩衝區 每個圖元的樣本 ForcedSampleCount。 其餘位為 0。
不論使用保守點陣化,此輸入都可以在著色器中使用,不過保守派點陣化會變更其行為,只顯示涵蓋的所有樣本(或協助程式圖元均未顯示)。
InnerCoverage 互動
此功能是必要功能,且僅適用於第 3 層。 當實作支援第 3 層以下的層級時,運行時間會讓著色器建立失敗,而著色器會使用此模式。
像素著色器具有可用的 32 位純量整數系統產生值:InnerCoverage
。 這是一個位欄位,只有保證該圖元完全位於目前基本類型內時,才會將 LSB 設定為 1 的位位。 當未設定位 0 時,所有其他輸入緩存器位都必須設定為 0,但在位 0 設定為 1 時未定義(基本上,此位字段代表布爾值,其中 false 必須正好為 0,但 true 可以是任何奇數 (亦即位 0 set) 非零值)。 此輸入用於低估的保守派點陣化資訊。 它會通知圖元著色器目前圖元是否完全位於幾何內部。
這必須考慮在解析度大於或等於目前 Draw 運作的解析度時發生擷取錯誤。 當圖元未完全涵蓋在解析度大於或等於目前 Draw 運作的解析度時,不得有誤判(設定 InnerCoverage
位),但允許誤判。 總而言之,實作不能不正確地將像素識別為完全涵蓋的圖元,而該圖元不會與轉譯器中的完整浮點頂點座標搭配使用。
如果硬體使用完整浮點頂點座標,則完全涵蓋的圖元,只有在它們與內部不確定性區域交集時才會省略,其大小不得大於子圖元網格線的大小,或固定點定義域中的 1/256 圖元。 另一種方式是,完全在內部不確定性區域內部界限內的像素必須標示為完全覆蓋。 不確定性區域的內部界限會以粗體黑色虛線來說明下圖。 1/256 來自 16.8 固定點轉譯器座標表示法,如果轉譯器精確度變更,則可能會變更。 這個不確定性區域足以考慮將浮點頂點座標轉換成點點頂點座標在轉譯器中造成的貼齊錯誤。
點陣化規則互動中定義的相同 1/512 最小不確定性區域需求也適用於這裡。
下圖說明一個有效的內部不確定性區域,其產生方式是將固定點定義域中基本類型邊緣四周的正方形掃掠(亦即頂點已由16.8固定點表示量化)。 這個平方的維度是以有效的內部不確定性區域大小為基礎:針對圖元的 1/256,平方是寬度和高度的圖元 1/128。 綠色三角形代表指定的基本類型,粗體黑色虛線代表內部不確定性區域的界限,實心黑色方塊代表沿著基本邊緣橫掃的正方形,而橙色複選區域是內部不確定性區域:
使用 InnerCoverage
不會影響圖元是否保守地點陣化,亦即,使用下列其中一個 InputCoverage
模式不會影響啟用保守點陣化模式時,哪些圖元會點陣化。 因此,當使用 InnerCoverage
且圖元著色器正在處理幾何未完全涵蓋的圖元時,其值會是0,但像素著色器調用會更新樣本。 這與 InputCoverage
為 0 時不同,這表示不會更新任何範例。
此輸入與 InputCoverage
互斥:這兩者都無法使用。
若要存取 InnerCoverage
,它必須宣告為其中一個像素著色器輸入緩存器中的單一元件。 宣告上的插補模式必須是常數(內插補點不適用)。
InnerCoverage
位欄位元元元不會受到深度/樣板測試的影響,也不會使用 SampleMask 轉譯器狀態進行 AND。
此輸入只有在保守點陣化模式中才有效。 未啟用保守點陣化時,InnerCoverage
會產生未定義的值。
由於協助程式圖元的需求所造成的圖元著色器調用,但基本類型未涵蓋,必須將 InnerCoverage
緩存器設定為 0。
屬性插補互動
屬性插補模式不會變更,而且會繼續與未啟用保守點陣化時一樣,其中會使用檢視區縮放和固定點轉換頂點。 因為保守地點陣化圖元中的所有樣本都會被視為涵蓋,所以對值進行推斷是有效的,類似於在 RenderTarget 上使用圖元頻率插補模式時, 樣本計數大於 1。 距心插補模式會產生與對應非距心插補模式相同的結果:在此案例中,心心的概念毫無意義–其中樣本涵蓋範圍只有完整或 0。
保守點陣化允許變質的三角形產生圖元著色器調用,因此,變質的三角形必須使用指派給頂點 0 的值,以用於所有插補值。
裁剪互動
當啟用保守點陣化模式並停用深度剪輯時(當 depthClipEnable 轉譯器狀態設定為 FALSE 時),在落在 0 <= <z = w 範圍以外的基本類型區段,可能會有屬性內插補點的差異,視實作而定:從基本類型與相關平面交集的點(近或遠)使用常數值。 或屬性插補的行為就像停用保守派點陣化模式一樣。 不過,不論保守點陣化模式為何,深度值行為都相同,亦即落在深度範圍之外的基本類型,仍必須指定檢視區深度範圍最接近限制的值。 0 <= z <= w 範圍內的屬性插補行為必須維持不變。
剪輯距離互動
啟用保守點陣化模式時,裁剪距離有效,且在未啟用保守點陣化的所有樣本時,對於保守點陣化圖元的行為也一樣。
請注意,保守點陣化可能會造成 W 頂點座標的外推,這可能會導致 W <= 0。 這可能會導致個別圖元的剪輯距離實作在已以無效 W 值除以檢視方塊的剪輯距離上運作。 剪輯距離實作必須防範叫用圖元點陣化,其中頂點座標 W <= 0 (例如,由於在保守點陣化模式中發生外推)。
目標獨立點陣化互動
保守的點陣化模式與目標獨立點陣化 (TIR) 相容。 適用 TIR 規則和限制,對於保守點陣化像素的行為,就像涵蓋所有樣本一樣。
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 中的共角),或在固定點轉換後變質(轉譯器中的共音點頂點),可能或可能不會被撲殺:兩者都是有效的行為。 變質的三角形必須視為反向,因此,如果應用程式需要特定行為,則可以使用後臉撲殺或測試正面。 變質的三角形會針對所有插補值使用指派給頂點 0 的值。
除了硬體不支援這項功能的可能性之外,還有三層硬體支援。
- 第 1 層會強制執行最大 1/2 像素的不確定性區域,且不支援貼齊後變質。 這適用於地圖底圖轉譯、紋理地圖集、光源地圖產生和子圖元陰影地圖。
- 第 2 層會將最大不確定性區域減少為 1/256,而且需要不清除貼齊後變質。 這一層對於 CPU 型演算法加速(例如體素化)很有説明。
- 第 3 層會維持最大 1/256 不確定區域,並新增內部輸入涵蓋範圍的支援。 內部輸入涵蓋範圍會將新的值
SV_InnerCoverage
新增至高階底紋語言 (HLSL)。 這是 32 位純量整數,可在圖元著色器的輸入上指定,並代表低估的保守點陣化資訊(也就是說,是否保證圖元-to-be完全涵蓋)。 此層有助於遮蔽撲殺。
API 摘要
下列方法、結構、列舉和協助程式類別參考保守派點陣化:
- D3D12_RASTERIZER_DESC:包含轉譯器描述的結構。
- D3D12_CONSERVATIVE_RASTERIZATION_MODE:模式的列舉值(開啟或關閉)。
- D3D12_FEATURE_DATA_D3D12_OPTIONS:結構,包含支援層。
- D3D12_CONSERVATIVE_RASTERIZATION_TIER:硬體支援每一層的列舉值。
- CheckFeatureSupport :存取支援功能的方法。
- CD3DX12_RASTERIZER_DESC :用於建立轉譯器描述的協助程序類別。
相關主題