共用方式為


點陣化規則

點陣化規則會定義向量數據如何對應至點陣數據。 點陣數據會貼齊到整數位置,然後加以撲殺和裁剪(以繪製最小像素數目),而每個像素屬性會在傳遞至圖元著色器之前插入(從每個頂點屬性插入)。

有數種類型的規則,這取決於所對應的基本類型,以及數據是否使用多重取樣來減少別名。 下圖示範如何處理邊角案例。

三角形點陣化規則 (不含多重取樣)

繪製落在三角形內的任何圖元中心;如果像素通過左上方規則,則會假設圖元位於 內部。 左上方規則是,如果圖元置中位於上邊緣或三角形的左邊緣,則會定義圖元中心位於三角形內部。

哪裡:

  • 上邊緣是一個完全水準且高於其他邊緣的邊緣。
  • 左邊緣,是並非完全水準且位於三角形左側的邊緣。 三角形可以有一或兩個左邊緣。

左上方規則可確保相鄰的三角形繪製一次。

此圖顯示繪製的圖元範例,因為它們位於三角形內,或遵循左上方規則。

左上三角形點陣化範例的圖例

圖元的淺灰色和深灰色會將其顯示為圖元群組,以指出其內部的三角形。

線條點陣化規則 (別名,不含多重取樣)

線條點陣化規則會使用菱形測試區域來判斷線條是否涵蓋圖元。 對於 x 主要線(-1 <= 斜率 <= +1),鑽石測試區域包括左下邊緣、右下邊緣和下角;菱形排除(顯示虛線)左上角、右上角、上線線、左角和右角。 Y 主要線是任何不是 x 主要線的行:測試菱形區域與 x 主要線條的描述相同,但也包含右角。

假設菱形區域,如果線條在從開始到終點沿著線條移動時離開圖元的菱形測試區域,則線條會覆蓋圖元。 線條帶的行為相同,因為它繪製成一連串的線條。

下圖顯示一些範例。

別名線條點陣化範例的 圖例

線條點陣化規則 (反鋸齒,不含多重取樣)

反鋸齒線會點陣化為矩形(寬度 = 1)。 矩形與產生每個像素涵蓋範圍值的轉譯目標相交,這些值會乘以圖元著色器輸出 Alpha 元件。 在多重取樣的轉譯目標上繪製線條時,沒有預先格式化的反鋸齒。

據認為,沒有單一的「最佳」方式可執行反鋸齒線轉譯。 Direct3D 10 採用 作為指導方針,如下圖所示的方法。 此方法是在經驗上衍生的,並表現出一些被視為可取的視覺屬性。 硬體不需要完全符合此演算法;針對此參考的測試應具有「合理的」容錯,由下面所列的一些原則所引導,允許各種硬體實作和篩選核心大小。 不過,硬體實作中允許的這種彈性都無法透過 Direct3D 10 與應用程式進行通訊,而不只是繪製線條並觀察/測量其外觀。

反鋸齒線點陣化範例的 圖例

此演算法會產生相對平滑的線條,具有統一強度,且邊緣不規則或辮子。 關閉線條的Moire圖樣最小化。 線段之間放置端對端線段之間的接點有良好的涵蓋範圍。 篩選核心是邊緣模糊量與伽瑪校正所造成的強度變化之間的合理取捨。 涵蓋範圍值會乘以下列公式的圖元著色器 o0.a (srcAlpha),並依輸出合併階段:srcColor * srcAlpha + destColor * (1-srcAlpha)。

點點點陣化規則 (不含多重取樣)

點會解譯為 Z 模式中的兩個三角形,其使用三角形點陣化規則。 座標會識別一個像素寬方形的中心。 積分沒有撲殺。

下圖顯示一些範例。

點陣化圖例

多重取樣反鋸齒點陣化規則

多重取樣反鋸齒 (MSAA) 會使用圖元涵蓋範圍和多個子樣本位置的深度樣板測試來減少幾何別名。 為了改善效能,每個像素的計算會針對每個涵蓋的圖元執行一次,方法是跨涵蓋的子圖元共用著色器輸出。 多重取樣反鋸齒不會減少表面別名。 範例位置和重建功能相依於硬體實作。

下圖顯示一些範例。

多取樣反鋸齒狀點陣化範例的 圖例

範例位置的數目取決於多重取樣模式。 頂點屬性會在圖元中心插補,因為這是叫用圖元著色器的位置(如果未涵蓋中心,這會變成外推)。 屬性可以在圖元著色器中標幟為心形取樣,這會導致非涵蓋的圖元在圖元區域和基本類型交集處插補屬性。 圖元著色器會針對每個 2x2 像素區域執行,以支援衍生計算(使用 x 和 y 差異)。 這表示著色器調用的發生超過顯示的填滿最小 2x2 quanta (這與多重取樣無關)。 針對通過每個樣本深度樣本測試的每個涵蓋樣本,都會寫出著色器結果。

基本類型的點陣化規則一般不會變更多重取樣反鋸齒,但除外:

  • 針對三角形,會針對每個樣本位置執行涵蓋範圍測試(不適用於圖元中心)。 如果涵蓋多個範例位置,圖元著色器會執行一次,並在圖元中心插入屬性。 結果會針對通過深度/樣板測試的圖元中的每個涵蓋樣本位置儲存(複寫)。

    線條會被視為由兩個三角形組成的矩形,線條寬度為1.4。

  • 針對某個點,會針對每個樣本位置執行涵蓋範圍測試(不適用於圖元中心)。

許多格式支援多重取樣(請參閱 direct3D 10 格式的硬體支援),某些格式可以解析(ResolveSubresource;這會將多重取樣格式縮減為樣本大小 1)。 多重取樣格式可用於轉譯目標,這些目標可以使用 載入讀取回著色器,因為著色器存取的個別樣本不需要解析。 多重取樣資源不支援深度格式,因此深度格式僅限於轉譯目標。

無類型格式(例如R8G8B8A8_TYPELESS)支援多重取樣,以允許資源檢視以不同方式解譯數據。 例如,您可以使用 R8G8B8A8_TYPELESS 建立多重取樣資源、使用具有R8G8B8A8_UINT格式的轉譯目標檢視資源來轉譯,然後將內容解析為具有R8G8B8A8_UNORM數據格式的另一個資源。

硬體支援

API 會報告透過品質層級數目進行多重取樣的硬體支援。 例如,0 品質等級表示硬體不支援多重取樣(在特定格式和品質層級)。 質量等級的 3 表示硬體支援三種不同的範例配置和/或解析演算法。 您也可以假設下列各項:

  • 任何支援多重取樣的格式,都支援該系列中每個格式的相同質量等級。
  • 支援多重取樣且具有_UNORM、_SRGB、_SNORM或_FLOAT格式的每個格式,也支援解析。

多重取樣反鋸齒時屬性的距心取樣

根據預設,頂點屬性會在多重取樣反鋸齒期間插補到圖元中心;如果未涵蓋圖元中心,則會將屬性推斷到圖元中心。 如果包含心心語意的圖元著色器輸入(假設圖元未完全覆蓋)會在像素的涵蓋區域內某處取樣,可能位於其中一個涵蓋的樣本位置。 取樣遮罩(由轉譯器狀態指定)會在距心計算之前套用。 因此,遮罩的樣本不會作為距心位置使用。

參考轉譯器會針對距心取樣選擇取樣位置,如下所示:

  • 範例遮罩允許所有範例。 如果已涵蓋圖元,或未涵蓋任何樣本,請使用圖元中心。 否則,會從圖元中心開始選擇第一個涵蓋的樣本,然後向外移動。
  • 範例遮罩會關閉所有樣本,但一個範例(常見案例)。 應用程式可以透過單一位樣本遮罩值迴圈,並使用距心取樣重新轉譯每個樣本的場景,以實作多重通道超取樣。 這需要應用程序調整衍生專案,以針對較高的紋理取樣密度選取更詳細的紋理誤判。

多重取樣時的衍生計算

圖元著色器一律會使用最小 2x2 像素區域來執行,以支援衍生計算,其計算方式是在相鄰圖元的資料之間取得差異(假設每個圖元中的數據已水準或垂直取樣單位間距)。 這不受多重取樣影響。

如果在已取樣心的屬性上要求衍生專案,則不會調整硬體計算,這可能會導致不正確的衍生專案。 著色器會預期轉譯目標空間中的單位向量,但可能會取得相對於某些其他向量空間的非單位向量。 因此,當向取樣心的屬性要求衍生專案時,應用程式必須謹慎行事。 事實上,建議您不要結合衍生產品和距心取樣。 距心取樣對於基本型別的插補屬性不是推斷出至關重要的情況,但有一些取捨,例如,在基本邊緣跨越圖元(而不是持續變更)或衍生LOD的紋理取樣作業無法使用的屬性時,就會有取捨。

轉譯器階段