共用方式為


點陣化規則

點陣化規則會負責定義向量資料與點陣資料的對應方式。 點陣資料會貼齊至整數位置,而該位置後續會進行揀選和裁剪 (以繪製數量最少的像素),而每個像素的屬性則會先進行插補 (從每個頂點的屬性),再傳遞至像素著色器。

規則有許多不同類型,且會視進行對應的原始物件類型,以及資料是否要使用多重取樣來消除鋸齒而定。 下列圖例將示範如何處理邊角案例。

三角形的點陣化規則 (不進行多重取樣)

下圖繪製了位於三角形內的任何像素中心;如果採用左上方的規則,就會假設像素位於內部。 左上方規則意味著:根據定義,如果像素位於三角形的上方邊緣或左側邊緣,則像素中心會位於三角形內部。

其中:

  • 上方邊緣不僅完全水平,也高於其他邊緣。
  • 左側邊緣則非完全水平,且位於三角形的左側。而單一三角形可具備一個或兩個左側邊緣。

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

這個圖示顯示了繪製像素的多個範例,而它們會位於三角形內部,或是依循左上方規則。

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

像素的淺灰色和深灰色區域會將其顯示為像素群組,可用來指出像素位於哪個三角形內部。

線條的點陣化規則 (鋸齒化且不進行多重取樣)

線條點陣化規則會使用菱形測試區域來判斷線條是否涵蓋像素。 針對 x 主要線條 (採用 -1 <= 斜率 <= +1 的線條),菱形測試區域會包含 (以實線顯示) 左下方邊緣、右下方邊緣,以及底部邊角;而菱形會排除 (以虛線顯示) 左上方邊緣、右上方邊緣,上方邊角、左側角落和右側角落。 y 主要線條則為 x 主要線條以外的線條;其菱形測試區域與先前所述的 x 主要線條相同,但會同時包含右側角落。

在菱形區域中,如果線條從起點到終點移動時,會離開像素的菱形測試區域,則線條會涵蓋像素。 帶狀線的行為也與此相同,因為帶狀線會繪製為一系列的線段。

下圖顯示了部分範例。

別名線條點陣化的範例

線條的點陣化規則 (反鋸齒化且不進行多重取樣)

反鋸齒化線條會透過如同矩形般的方式來進行點陣化 (而寬度 = 1)。 矩形會與產生每一像素涵蓋範圍值的轉譯目標相交,該值會與像素著色器輸出 Alpha 元件相乘。 在繪製多重取樣轉譯目標時,並不會執行任何反鋸齒作業。

執行反鋸齒線條轉譯的「最佳」方式並不存在。 下圖所示方法會採用 Direct3D 以做為指導方針。 這個方法衍生自相關經驗,且顯示了幾個具有必要性的視覺屬性。

硬體無需完全符合這個演算法;對此參考進行測試作業應具備「合理的」容錯,並依循下方所列部分原則的指引,以允許各種硬體實作和篩選核心大小。 硬體實作並不允許上述任何彈性,但可透過 Direct3D 與應用程式通訊,而非單純繪製線條及觀察/測量其外觀。

反鋸齒線點陣化的範例

這個演算法會產生相對平滑且具備強度一致的線條,而邊緣僅會呈現最低限度的不規則或纏繞情況。 這會盡可能抑制鄰近線條的摩爾紋情況。 端對端置放線段之間的接合則能妥善地加以涵蓋。

篩選核心可在邊緣模糊量和變更 Gamma 修正產生的強度變化之間做出合理的取捨。 涵蓋範圍值會依照輸出合併 (OM) 階段的下列公式,與像素著色器 o0.a (srcAlpha) 彼此相乘:

srcColor * srcAlpha + destColor * (1-srcAlpha)

點的點陣化規則 (不進行多重取樣)

點會解譯為如同在 Z 模式中以兩個三角形組成,並使用三角形的點陣化規則。 座標會識別一個像素寬的方形中心。 點不會進行任何揀選。

下圖顯示了部分範例。

點陣化範例

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

多重取樣反鋸齒 (MSAA) 會在多個子取樣位置使用像素涵蓋範圍和深度樣板測試,藉此減少幾何鋸齒。 為了改善效能,系統會透過在涵蓋的子像素之間共用著色器輸出,針對每個涵蓋的像素執行一次每個像素的計算。 多重取樣反鋸齒並不會消除表面鋸齒。 取樣位置和重建功能會視硬體實作而定。

下圖顯示了部分範例。

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

取樣位置的數量會視多重取樣模式而定。 頂點屬性會在像素中心進行插補,因為該處為叫用像素著色器的位置 (如果並未涵蓋中心,這就會造成外推)。 屬性可在像素著色器中加以標示,以進行距心取樣,該取樣作業會導致未涵蓋的像素將屬性插補在像素區域和原始物件的交集。

像素著色器會針對每個 2x2 的像素區域執行,以支援導數計算 (使用 x 和 y 差異進行)。 這表示,著色器叫用的發生次數會比顯示的次數更多,以填寫最小的 2x2 量子 (與多重取樣無關)。 著色器結果會針對通過每個取樣之深度樣板測試的每個涵蓋樣本進行寫出。

通常,多重取樣反鋸齒並不會變更原始物件的點陣化規則,但以下情況則不在此限:

  • 針對三角形,系統會針對每個取樣位置 (而非針對像素中心) 執行涵蓋範圍測試。 如果涵蓋多個取樣位置,像素著色器就會執行一次,並在像素中心插補屬性。 針對通過深度/樣板測試之像素中的每個涵蓋區域,結果會進行儲存 (複寫)。

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

  • 針對點,系統會針對每個取樣位置 (而非針對像素中心) 執行涵蓋範圍測試。

多重取樣格視可用於轉譯目標中,並使用 load 讀回著色器,因為著色器存取的個別取樣無需任何解析。 多重取樣資源不支援深度格式,因此,深度格式僅限使用在轉譯目標上。

無類型格式可支援多重取樣,好讓資源檢視能以不同的方式來解譯資料。 舉例來說,您可以使用 R8G8B8A8_TYPELESS 建立多重取樣資源、使用轉譯目標檢視資源來透過 R8G8B8A8_UINT 格式加以轉譯,然後使用 R8G8B8A8_UNORM 資料格式將內容解析至另一個資源。

硬體支援

API 會透過品質等級數來回報適用於多重取樣的硬體支援。 舉例來說,0 品質等級意味著硬體不支援 (特定格式和品質等級的) 多重取樣。 品質等級為 3,則意味著硬體支援三種不同的取樣配置和/或解析演算法。 您也可以做出以下假設:

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

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

根據預設,在多重取樣反鋸齒期間,頂點屬性會插補至像素中心;如果並未涵蓋像素中心,屬性就會外推至像素中心。 如果包含距心語意 (假設像素並未完全涵蓋) 的像素著色器輸入將於像素涵蓋區域中的某處進行取樣,即有可能位於任一涵蓋的取樣位置。 取樣遮罩 (由轉譯器狀態指定) 會於距心運算前套用。 因此,遭到遮罩的取樣將不會做為距心位置使用。

參考轉譯器會使用與下列相似的方法,為距心取樣選擇取樣位置:

  • 取樣遮罩允許所有取樣。 如果已涵蓋像素,或如果未涵蓋任何像素,就會使用像素中心。 否則,就會從像素中心開始選擇第一個涵蓋的取樣,並向外移動。
  • 取樣遮罩會關閉所有取樣,且只留下一個取樣 (常見情境)。 應用程式可以在單一為元取樣遮罩值之間循環,並使用距心取樣重新轉譯每個取樣的場景,藉此實作 Multipass 超取樣。 這會要求應用程式調整導數,以適當選取更詳細的紋理 MIP,進而達到更高的紋理取樣密度。

多重取樣時的導數計算

像素著色器一律會使用至少 2x2 的像素區域執行,以支援導數計算,該計算會使用來自相鄰像素的資料差異來進行計算 (假設每個像素中的資料以使用單位間距水平或垂直取樣)。 這不會受多重取樣影響。

如果如果距心已取樣的屬性上會要求導數,硬體計算就不會做出調整,因為這有可能導致導數不正確。 著色器預計取得轉譯目標空間中的單元向量,但可能會得到與其他某些向量空間相關的非單元向量。 因此,在要求來自距心已取樣之屬性的導數時,應用程式應負責謹慎處理。

事實上,建議您不要將導數和距心取樣結合運用。 距心取樣可在原始物件的插補屬性不得外推時發揮效用,但這也會造成一些取捨,例如屬性會跳至原始物件邊緣與像素的交叉處 (而非持續變更),或是衍生 LOD 的紋理取樣作業會無法使用導數。

附錄

轉譯器 (RS) 階段