> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 色彩與深度壓縮

> 色彩與深度壓縮

本主題說明圖形硬體所使用的低階轉譯目標色彩壓縮與解壓縮格式。

* [圖形管線](#ID4EY)
* [色彩壓縮術語](#ID4ELB)
* [色彩區塊](#ID4ECE)
* [色彩壓縮](#ID4EMF)
* [色彩壓縮配置](#ID4EVF)
* [增強品質反鋸齒 (EQAA)](#ID4EJG)
* [功能相容性](#ID4EUG)
* [色彩壓縮的 API](#ID4E5G)
* [效能與偵錯](#ID4ESBAC)

<a id="ID4EY" />

## 圖形管線

下圖顯示邏輯圖形管線。深度區塊與色彩區塊是轉譯輸出前的最後兩個邏輯作業。 <img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/logical_graphics_pipeline.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=2f67ad622842ab04b29990e77b7573cb" alt="邏輯圖形管線" width="561" height="528" data-path="images/gdk/features/graphics/logical_graphics_pipeline.png" />

紋理壓縮格式的處理方式與色彩和深度不同。如需詳細資訊，請參閱 [XBOX One 的原生資源管理](/zh-TW/build/core-features/graphics/directx/native-resource-management)。

<a id="ID4ELB" />

## 色彩壓縮術語

以下是描述壓縮系統時常用的術語。

| 術語 | 描述 |
| - | - |
| CMask | 圖格層級色彩壓縮的資料。 |
| FMask | 四邊形 (quad) 層級色彩壓縮的資料。 |
| Quad | 2 × 2 的像素群組。 |
| Tile | 8 × 8 的像素群組，或 4 × 4 的 quad 群組。 |
| Fragment | 壓縮像素的一個樣本。 |
| Resolve | 使用像素對齊的方塊篩選，從多重取樣表面產生單一樣本表面。 |
| MRT | 多重轉譯目標。可在單一狀態下轉譯的多個表面。它們有時會被多載用於特殊功能 (例如 resolve 與雙來源混合)。效能預期會隨 MRT 數量線性下降，但有許多因素可能使效能比線性更差。這類限制效能的因素包括記憶體控制器頻寬效率，以及由於以像素計算的快取大小隨 MRT 數量線性縮減，導致快取利用空間區域性的能力下降。 |
| ROP | 點陣作業。對來源色彩、目的地色彩及使用者定義欄位執行的逐位元邏輯作業。ROP 是一種位元運算，使用來源與目的地色彩來變更寫入記憶體的色彩。標準 ROP3 是目的地、來源與筆刷的函式。目的地是轉譯目標中已格式化的內容。不混合時，來源是格式化後的著色器輸出色彩；混合時，來源是格式化後的混合器輸出。在色彩區塊中，筆刷與來源相同。 |
| MSAA | 多重取樣反鋸齒。一種透過儲存比轉譯所需更多的深度資訊來減少幾何鋸齒的技術。在沒有壓縮的情況下，每個樣本都有唯一的片段色彩值。 |
| EQAA | 增強品質反鋸齒。MSAA 的一種版本，所儲存的片段少於樣本位置，在指定的記憶體使用量下可能提供更高品質的影像。 |

<a id="ID4ECE" />

## 色彩區塊

色彩區塊負責將像素著色器的色彩資料輸出傳輸到記憶體。此程序包括管理 MSAA 壓縮、色彩混合、色彩格式化、ROP，以及寫入記憶體。

色彩區塊允許像素的著色器輸出色彩 (來源色彩，CS) 與該像素在轉譯目標中的目前色彩 (目的地色彩，CD)，使用混合因數 (BF(S,D)) 與指定的組合函式進行結合。此混合的一般方程式稱為「*混合方程式*」。

```cpp theme={null}
NewDestinationColor = CombinationFunction(BFS*CS, BFD*CD)  
```

色彩區塊負責將格式為 UINT32、SINT32、FP32 或 FP16 的著色器輸出色彩轉換為轉譯目標格式。僅支援 uint->uint、sint->sint、unorm->unorm、snorm->snorm 以及 FP->非整數的轉換。著色器會輸出 UINT32、SINT32 與 FP32。基於效能考量，著色器系統會視情況將 FP32 轉換為 FP16 或 U/SNORM16。

色彩區塊支援多項特殊功能：

* 一種稱為「*雙來源混合*」的特殊混合模式。大部分混合因數是來源色彩、目的地色彩或混合常數色彩的函式，而雙來源混合則使用第二個著色器輸出色彩 (指派給 MRT1) 作為混合因數。混合方程式中的來源色彩取自 MRT0。
* 2x、4x 與 8x MSAA。色彩區塊中有數項 MSAA 專屬功能，例如使用方塊篩選 (平均像素的子樣本以取得像素的最終色彩) 對任何可混合表面進行硬體 resolve，以及色彩壓縮 (於下一節說明)。
* 使用 8\_8\_8\_8 sRGB 格式的伽瑪校正畫面緩衝區。
* 快速清除色彩表面。這是藉由只清除與表面中每個圖格相關聯的 CMask 位元來達成。當 quad 繪製到已快速清除的圖格時，色彩區塊具有特殊硬體，可事後填入圖格中未被觸及的部分。

在要讀取轉譯表面時，已快速清除的轉譯目標可能需要將其清除色彩寫入未與清除後所轉譯之幾何相交的圖格。這稱為「*快速清除消除*」(fast clear eliminate)。實際上，CMask 中已清除的區域需要在主要表面上複寫為已清除狀態。

色彩區塊以三階段管線實作。

1. CMask 快取管理圖格層級的壓縮資訊。
2. FMask 快取管理 quad 層級的壓縮資訊。
3. 色彩快取與混合器執行像素更新。

<a id="ID4EMF" />

## 色彩壓縮

多重取樣反鋸齒 (MSAA) 是一種減少因像素解析度有限而造成之視覺瑕疵的方法。在 MSAA 中，每個像素的最終值由像素內取得的 2、4 或 8 個色彩樣本決定。這些樣本都會從像素著色器接收相同的色彩，但每個樣本會個別進行深度測試。這會讓幾何邊緣有更精細的細節。多重取樣像素比單一取樣像素需要更多記憶體與處理資源，這就是實作色彩壓縮配置的原因。

色彩壓縮是一種無失真的逐像素配置，目標是節省記憶體頻寬，並將處理多重取樣像素所需的時脈週期數量降到最低。在 8xMSAA (每個像素 8 個樣本) 中，每個像素可能需要簡單單一樣本像素 8 倍的記憶體頻寬與 8 倍的處理能力。一般而言，像素的樣本高度重複，像素的樣本只包含一或兩個唯一色彩值。8xMSAA 像素的所有樣本都具有 8 個唯一值的情況很少見。樣本間的高度差異並非不可能，它可能出現在具有精細鑲嵌幾何的場景中，也可能純屬偶然。壓縮配置的目標是利用一般場景中的樣本重複性。

<a id="ID4EVF" />

## 色彩壓縮配置

為了壓縮 MSAA 像素，會利用重複性，只儲存每個唯一色彩一次。例如，在 8xMSAA 中，8 個樣本可能看起來像下表中的色彩。只有三個唯一色彩，但目前它們佔用了 8 個的空間。 <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/fmask_sample.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=5fa4dc5da634d854be7134c0e6be4246" alt="三個唯一色彩佔用八個的空間" width="200" height="200" data-path="images/gdk/features/graphics/fmask_sample.png" />

最低層級的壓縮稱為「*FMask 壓縮*」，它會為像素的每個樣本提供一個指標來移除這種重複性。該指標會告訴壓縮配置哪個樣本包含此樣本的實際色彩。8xMSAA 指標只有 3 位元，而 4xMSAA 與 2xMSAA 分別為 2 與 1 位元。如上表所示，這會減少所需的色彩資料量。由於我們必須始終能夠容納具有最大唯一樣本色彩數量的像素，因此壓縮配置不會減少記憶體使用量。相反地，壓縮配置讓我們只讀取/寫入至少被一個 FMask 指標所指向的樣本位置，以節省記憶體頻寬。在上表中，我們從讀取/寫入 8 個色彩減少為只讀取/寫入 3 個。此外，任何色彩區塊作業 (例如混合或 ROP) 只會對 3 個色彩而非 8 個進行運算，如下表所示。 <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/fmask_pointers.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=340dd298656ad179146ce148de87a27d" alt="FMask 記憶體與色彩記憶體" width="368" height="262" data-path="images/gdk/features/graphics/fmask_pointers.png" />

壓縮配置也實作了更高層級的壓縮，稱為「*CMask 壓縮*」。在上表中，雖然我們以較少的色彩資料節省了頻寬，但每個像素仍必須讀取 8 個 FMask 指標。CMask 壓縮藉由將讀取的指標資料量降到最低來節省記憶體頻寬。在常見情況下，只有 1 或 2 個唯一指標。CMask 是一個四位元值，編碼哪些區域已快速清除，以及指定圖格需要載入多少位元平面。每個區域有 1 位元的快速清除資料。值為 0 表示已快速清除。另有兩位元編碼指定圖格需要載入多少位元平面，如下表所示。 <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/cmask_bitplanes.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=3e0f07a3514b6739e2abfce0f099c5d3" alt="CMask 位元平面" width="478" height="109" data-path="images/gdk/features/graphics/cmask_bitplanes.png" />

<a id="ID4EJG" />

## 增強品質反鋸齒 (EQAA)

增強品質反鋸齒 (EQAA) 是反鋸齒的失真壓縮。它是無失真色彩壓縮演算法的延伸。色彩儲存空間會縮減，因此沒有足夠的儲存空間讓每個樣本都有唯一色彩。大部分情況下，像素只有少數唯一色彩。FMask 可以將這些色彩對應以涵蓋整個像素。對於 EQAA，色彩區塊最多支援 16 個樣本。由於記憶體使用量過大，色彩區塊不支援一般 MSAA 使用 16 個樣本。

色彩區塊不會嘗試猜測或內插色彩。當它無法判斷色彩應為何，或無法負擔儲存該色彩時，色彩區塊會在 FMask 中將對應的樣本標示為未知。

EQAA 的轉譯與 MSAA 中的正常轉譯相同，但受限於只有特定數量的樣本是正確的。每個表面的樣本數量有上限。

<a id="ID4EUG" />

## 功能相容性

下表顯示色彩區塊中允許的作業組合。 <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/cb_features.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=dd2ec170803d2c0dd0960e87d345173e" alt="色彩區塊中允許的作業組合" width="344" height="168" data-path="images/gdk/features/graphics/cb_features.png" />

<a id="ID4E5G" />

## 色彩壓縮的 API

許多 API、結構與列舉都會參考 MSAA、EQAA、FMask 與 CMask。XG 程式庫提供 FMask 與 CMask 設定的配置。如需詳細資訊，請參閱 [ID3D12Device::CreateComponentPlacedResourceX](/zh-TW/reference/graphics/d3d12_x/interfaces/id3d12device/methods/id3d12device_createcomponentplacedresourcex)。

請注意，呼叫 [ID3D12GraphicsCommandList::RSSetMSAAParametersX](/zh-TW/reference/graphics/d3d12_x/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_rssetmsaaparametersx) 或 [ID3D12GraphicsCommandList1::SetSamplePositions](https://learn.microsoft.com/windows/desktop/api/d3d12/nf-d3d12-id3d12graphicscommandlist1-setsamplepositions) 時應包含完整的 MSAA 狀態設定。

另請注意，使用這些 API 時，用來取得樣本數量與樣本位置的高階著色器語言 (HLSL) 內建函式會傳回不正確的樣本位置。

如需詳細資訊，請參閱下列結構與列舉的欄位與備註：

* [D3D12XBOX\_MSAA\_SAMPLE\_LOCATIONS](/zh-TW/reference/graphics/d3d12_x/structs/d3d12xbox_msaa_sample_locations)
* [D3D12XBOX\_MSAA\_CENTROID\_PRIORITIES](/zh-TW/reference/graphics/d3d12_x/structs/d3d12xbox_msaa_centroid_priorities)
* [D3D12XBOX\_MSAA\_PARAMETERS](/zh-TW/reference/graphics/d3d12_x/structs/d3d12xbox_msaa_parameters)

<a id="ID4ESBAC" />

## 效能與偵錯

PIX 工具有許多針對 MSAA 效能的特定測試。如需詳細資訊，請參閱 [Dr. PIX](/zh-TW/tools/tools-console/pix/gpu/pix-drpix)。

有許多以 CB\_PERF\_SEL\_CM\_FC\_TILE\_VALID\_READY 開頭的計數器會參考 FMask 與 CMask 作業。如需詳細資訊，請參閱 [PIX 硬體計數器表](/zh-TW/tools/tools-console/pix/gpu/pix-table-of-hardware-counters)。

<a id="ID4EDCAC" />

## 另請參閱

[CMask 解碼](/zh-TW/build/core-features/graphics/overviews/cmask-decoding)


## Related topics

- [XBOX GDK 主機開發的 NDA 主題索引](/zh-TW/nda/nda-overview.md)
- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [主機上的開發人員首頁 (Dev Home)](/zh-TW/tools/tools-console/devhome/devhome.md)
- [D3D12_RENDER_PASS_DEPTH_STENCIL_DESC](/zh-TW/reference/graphics/d3d12/structs/d3d12_render_pass_depth_stencil_desc_public.md)
- [ILampArray::SetColorsForIndices 方法](/zh-TW/reference/lighting/lamparray/interfaces/ilamparray/methods/ilamparray_setcolorsforindices.md)
