Windows 硬體顯示色彩校正管線
本主題涵蓋使用 Windows 10 版本 2004(20H1) 和更新版本所支援的新 GPU 顯示器色彩轉換管線來顯示色彩校正。 管線可大幅改善現有路徑的色彩精確度,例如 GDI 伽瑪斜坡 管線,並新增對 HDR 顯示器的支援。
本主題適用於顯示器和計算機製造商,以及顯示校正提供者,其想要更妥善地校正客戶的顯示器。 大部分的 Windows 應用程式不需要執行任何動作即可從管線獲益;但是,如果您開發色彩管理的應用程式,您可能想要瞭解這項技術的運作方式。
如果 GPU 符合系統需求,則新的色彩管線可供任何顯示器使用。 如果顯示器是 HDR 或使用自動色彩管理,則還有其他考慮和需求。 您可以在高/標準動態範圍顯示器上使用 DirectX 搭配進階色彩中找到。
簡介
顯示色彩校正是確保顯示器正確符合其回報色彩空間的程式;例如,sRGB 或 DCI-P3 D65。 由於製造程式和其他來源的變化,個別的顯示面板可能會偏離其規格。 一旦校正顯示器,您的應用程式和內容就可以自信地以顯示器的色彩空間為目標,而不必擔心該變異性或不準確。
概括而言,顯示色彩校正牽涉到下列步驟:
- 在呈現一組已知的色彩值時,執行顯示器實際色彩輸出的光學測量。
- 根據測量數據,產生色彩轉換,以更正顯示器中任何不準確之處,併產生描述顯示結果色彩磁碟區的元數據。
- 儲存色彩轉換數據,並顯示元數據以供稍後使用。
- 在運行時間,載入並套用色彩轉換至顯示畫面格緩衝區(傳送至顯示器的色彩值),並將顯示元數據報告給應用程式。
Windows 10 版本 2004 提供步驟 3 和 4 的增強功能,而顯示製造商和校正提供者則負責步驟 1 和 2。
系統需求
新的色彩轉換管線需要能夠的 GPU 和顯示驅動程式。 支援的 GPU 架構包括:
- AMD:
- AMD RX 500 400 系列或更新版本
- AMD Ryzen 處理器與 Radeon Graphics
- 英特爾:
- 整合:Intel 10 Gen GPU(Ice Lake),或更新版本
- 離散:Intel DG1 或更新版本
- NVIDIA GTX 10xx 或更新版本 (Pascal+)
- Qualcomm 8CX Gen 3 或更新版本;7C Gen 3 或更新版本
注意
不支援 Intel codename Comet Lake (5 位數模型代碼) 晶片組。
需要 Windows 顯示驅動程式模型 (WDDM) 2.6 或更新版本驅動程式(Windows 10 版本 1903 發行)。 某些 GPU 廠商需要較新的驅動程式,可能和 WDDM 3.0 一樣新(Windows 11 版本 21H2 發行)。
如需應用程式如何判斷系統上是否有新的色彩轉換管線的相關信息,請參閱 新的顯示 ICC 配置檔管理 API 。
新的 GPU 色彩轉換管線
Windows 10 版本 2004 公開 GPU 加速的顯示色彩轉換管線,其中包含線性伽瑪色彩矩陣和 1DLUT。 相較於現有的 伽瑪坡形 管線,它提供優越的精確度、精確度,以及寬色域顯示器的支援。 此外,它新增了對使用 BT.2100 訊號的 HDR 顯示器等新技術的支援。
管線無法由應用程式直接程式化,而只會透過 MHC 配置檔公開;如需詳細資訊,請參閱下方。 其他操作系統 (OS) 功能,例如夜燈也可能使用此管線,而 OS 會管理如何在多個案例之間共用(撰寫)和/或合理化管線存取。
色彩轉換管線描述
色彩轉換管線是以色彩空間轉換的標準概念模型為基礎:
此模型可以在任兩個 RGB(或其他 3 通道)色彩空間之間轉換,例如 sRGB 轉換為 P3 D65。 它也可以更正最常見的面板色彩變化類型。
Windows 色彩轉換管線會採用概念模型、將階段 2(色彩矩陣)和 3(目標 regamma)展開為子階段,並公開應用程式程式設計階段的子集(2b 和 3b,以綠色表示),同時讓其餘部分(白色)由驅動程式控制:
這些修改可讓色彩管線與來源內容的色彩空間無關,這可能會在畫面對框架的基礎上變更。 此外,它可改善與顯示色彩空間的相容性,例如 BT.2100 ST.2084,這需要不透明的優化,才能保留精確度。
階段 0:來源(圖形輸入)
輸入是從OS轉譯的畫面格緩衝區。 視案例而定,它可以在數個色彩空間的其中一個,包括 sRGB、sYCC、HDR10 或 scRGB,而且可以在畫面對框架的基礎上變更。
階段 1:來源 DeGamma
顯示驅動程式會自動將來源內容轉換成線性伽瑪,而且這個階段無法由應用程式進行程式化。
階段 2:色彩空間轉換矩陣
在標準色彩空間轉換模型中,矩陣階段可以細分為三個矩陣,這些矩陣會組成(乘以)在一起:
2a: 從來源內容 RGB 色彩空間(線性伽瑪)轉換為絕對色彩空間;在 Windows 管線中,絕對色彩空間為 CIEXYZ。
2b: 在 CIEXYZ 空間中執行任何調整,例如校正。
2c: 從 CIEXYZ 轉換為目標 RGB 色彩空間(線性伽瑪)。 目標 RGB 色彩空間定義為在顯示線路上傳輸色彩時所使用的編碼方式,通常是 BT.709 或 BT.2020 初選。 這不是實體面板的實際、測量初選。
矩陣 2a 是由來源內容決定,而矩陣 2c 則由顯示器的訊號模式決定:只有矩陣 2b 可供應用程式存取。 驅動程式會將三個乘以產生實際矩陣,以在硬體中執行:
FinalMatrix = SourceRGBtoXYZ * XYZtoXYZAdjust * XYZtoTargetRGB
注意
由於顯示驅動程式負責來源 RGB 到 XYZ,並將 XYZ 設為 RGB 轉換目標,因此您程式 (階段 2b) 的矩陣不應包含其中之一。
範例 1: 如果您未對色彩執行任何調整(傳遞),則不論您要輸出的顯示類型為何,矩陣都應該是身分識別。
範例 2: 如果您要輸出至 SDR P3 D65 顯示器,而且正在實作模擬面板上 sRGB 的「sRGB 校訂」配置檔,則矩陣應該包含從 sRGB 到 P3 D65 的初選輪替。
階段 3:目標 ReGamma
這個階段可以分成兩個 RGB 1DLUT,這些 1DLUT 會組成在一起:
3a: 將第 2 個階段的線性 RGB 數據編碼為透過顯示器線傳輸訊號的傳輸函式/伽瑪。
3b: 在目標伽瑪空間中執行任何調整,例如校正。
1DLUT 3a 是由顯示線格式色彩空間所決定:最常見的是 SDR 顯示器的 SRGB,以及適用於 HDR 顯示器的 ST.2084。 3b 可透過應用程式進行程式化,並在套用有線格式傳輸函式之後發生。 驅動程式會組成兩個 1DLUT,以產生要以硬體執行的實際 1DLUT:
Final1DLUT = Adjustment1DLUT(TargetReGamma(input))
注意
由於驅動程式負責設計顯示訊號傳輸函式,因此您程式 #3b 的 1DLUT 不應該包含該編碼。 例如,如果您未對色彩執行任何調整(傳遞),則不論顯示線格式色彩空間為何,您的 1DLUT 都應該是身分識別。
階段 4:目標 (輸出至掃描)
這是 GPU 透過網路掃描的框架緩衝區;在顯示器的原生色彩空間中,以及在您進行程序設計的任何調整之後。 之後可能會進行其他作業,例如 YCbCr 編碼。
更高的精確度和精確度
Windows 10 版本 1709 引進線性伽瑪矩陣階段 (XYZ 至 XYZ 調整) 功能。 此功能可讓您對主要色彩和白點以及任意 RGB 色彩空間轉換執行調整。
1DLUT 調整階段在概念上類似於現有的 伽瑪坡道 1DLUT,但提供改良的精確度,最多 4096 個 LUT 專案,最高 16 位固定點精確度。
注意
並非所有硬體都支援色彩管線公開的專案完整計數或精確度。
支援 HDR (BT.2100) 顯示器
現有 伽瑪坡道 管線的限制是,當顯示器使用 HDR (BT.2100 ST.2084) 訊號時,它有未定義的行為。 新的色彩轉換管線明確支援 SDR(BT.1886 或 sRGB)和 HDR 訊號,以及支援未來有線格式色彩空間的縮放比例。 它會透過區塊圖中的「XYZ 至目標 RGB」和「電匯函式」(藍色)階段來完成此作業:
這兩個階段由驅動程序自動控制,負責將色彩編碼成有線格式色彩空間:例如 sRGB 或 BT.2020 ST.2084。
因此,當您在設計色彩轉換管線時,會根據顯示器的作用中線格式色彩空間,取得妥善定義的行為。
ICC 設定檔的新 「MHC2」 標記
Windows 不提供 API,讓您在運行時間直接控制新的色彩轉換管線。 相反地,您的應用程式會藉由撰寫格式正確的國際色彩聯盟(ICC)色彩配置檔來存取管線,並將額外的數據儲存在新的“Microsoft硬體校正”(“MHC2”) 私人標記中。 它是與現有的 伽瑪坡道 管線類似的模型,其使用 「VCGT」 私人 ICC 標記。 具有有效 MHC2 標記資料的 ICC 設定檔稱為「MHC ICC 設定檔」或「MHC 設定檔」。
注意
MHC2 是指私人標記的第二個版本,可供所有 Windows 10 版本 2004 裝置使用;MHC1 隨附於具有特定 OEM 計算機的舊版 Windows 上。
補充 ST.2086 HDR 靜態元數據
除了設計新的色彩轉換管線之外,MHC ICC 配置檔也包含 ST.2086 HDR 靜態元數據。 這些是描述顯示之動態範圍(亮度)和色域的值。 它們使用 HDR 顯示器廣泛實作,但對於任何顯示器都很有用。 值如下:
- 尖峰亮度 (尼茨)
- 最大全框架亮度 (nits)
- 最小亮度 (尼茨)
- RGB 色彩初選 (xy 座標)
- 白點 (xy 座標)
使用標準 ICC 標籤來描述白點、最大完整畫面亮度和 RGB 色彩初選。 MHC2 標籤會描述尖峰和最小亮度。 配置文件必須包含作業系統接受配置檔的所有此資訊,並用於進階色彩案例。
Windows 會合理化來自多個來源的 ST.2086 元數據,包括 MHC ICC 配置檔、圖形驅動程式和 EDID 或 DisplayID 韌體。 MHC ICC 設定檔會被視為最受信任的來源,並將覆寫其他來源。 Windows 會透過 HDR 功能 API 公開這項資訊,如在高/標準動態範圍顯示器上使用 DirectX 與進階色彩中所述,因此,HDR 應用程式會獲得最佳的 HDR 顯示資訊。
可調整回光顯示器的 ST.2086 亮度定義
顯示器可能會有可調整的反光燈,例如由使用者控制,或由環境光線感測器自動控制。 這會導致 ST.2086 亮度值如何解譯的模棱兩可。
針對 Windows 可控制回光燈(通常是膝上型電腦和整合式面板裝置)的顯示器,亮度值必須描述此 OS 控制的反光燈處於最大或最亮的設定時。
對於 Windows 無法控制回光燈的顯示器(通常是外部監視器),亮度值僅適用於測量時的顯示狀態。
ICC 配置檔需求
MHC ICC 配置文件必須使用 ICC 規格第 2 版(ICC.1:2001-04)或 4 版(ICC.1:2010-12/ISO 15076-1:2010)。 MHC ICC 設定檔必須是顯示裝置設定檔。
MHC ICC 設定檔可能包含色彩轉換管線數據。 定義色彩轉換的 MHC2 結構部分可能是空的,這明確表示識別轉換。
MHC ICC 設定檔必須包含 ST.2086 元數據。 僅包含 ST.2086 元數據且未針對 HDR 顯示器校正案例使用任何轉換數據的配置檔;在此情況下,HDR 校正表示為 HDR 應用程式和遊戲提供更精確的最小/最大亮度和色彩範圍資訊。
重複使用現有的公用標記
MHC ICC 設定檔會使用現有的公用標記來定義一些 ST.2086 元數據值。 顯示裝置配置檔已經需要所有這些標籤。 您可以在 ICC 規格中找到標記和資料類型定義。
標籤名稱 | 資料類型 | ST.2086 值 | Windows 回報的單位 |
---|---|---|---|
redColorantTag | XYZNumber | 紅色主要複本 | 色度 (xy) |
greenColorantTag | XYZNumber | 綠色主要 | 色度 (xy) |
blueColorantTag | XYZNumber | 藍色主要 | 色度 (xy) |
mediaWhitePointTag | XYZNumber | 白點 | 色度 (xy) |
luminanceTag | XYZNumber | 最大完整畫面亮度 | 亮度 (尼茨) |
“MHC2” 私人標記定義
MHC ICC 設定檔必須包含一個 MHC2 標記結構。 矩陣和 1DLUT 色彩轉換元素可以設定為 0 (NULL),明確表示個別階段的識別轉換。 ST.2086 元數據值必須填入有效的數據。
位元組位置 | 欄位長度(位元組) | Content | 資料類型 |
---|---|---|---|
0 到 3 | 4 | 'MHC2' (4D484332h) 類型簽章 | MHC2Type |
4 到 7 | 4 | 標記數據元素開頭的位移 | uInt32Number |
8 到 13 | 4 | 標記數據元素的大小 | uInt32Number |
MHC2Type 結構定義
位元組位置 | 欄位長度(位元組) | Content | 資料類型 |
---|---|---|---|
0 到 3 | 4 | 'MHC2' (4D484332h) 類型簽章 | |
4 到 7 | 4 | 保留,設定為 0 | |
8 到 11 | 4 | 1DLUT 項目的數目 (4096 或更少) [1] 選擇性: 0 = 身分識別轉換 |
uInt32Number |
12 到 15 | 4 | ST.2086 nits 中的亮度 | S15Fixed16Number |
16 到 19 | 4 | ST.2086 nits 中的尖峰亮度 | S15Fixed16Number |
20 到 23 | 4 | 以位元組為單位的矩陣 位移 [2] 選擇性: 0 = 身分識別轉換 |
uInt32Number |
24 到 27 | 4 | 位元組到紅色 1DLUT 的位移 [2] | uInt32Number |
28 到 31 | 4 | 以位元組為單位的位移為綠色 1DLUT [2] | uInt32Number |
32 到 35 | 4 | 以位元組為單位的位移為藍色 1DLUT [2] | uInt32Number |
[1] OS 會將數據插補到硬體支持項目計數。
[2] MHC2Type 結構內的位移相對於結構的開頭,而不是檔案。
矩陣定義
位元組位置 | 欄位長度(位元組) | Content | 資料類型 |
---|---|---|---|
0 到 47 | 48 | 3x4 XYZ 至 XYZ 調整矩陣 儲存在數據列主要順序中,數據行 4 會被 忽略 [1] |
s15Fixed16Number |
[1] 矩陣結構會重設大小,以符合 3x4 矩陣的 12 個元素,依數據列主要順序排列。 不過,Windows 只會使用來自左三個數據行的數據,有效地定義 3x3 矩陣。 例如,以線性順序儲存這12個值:
[a, b, c, 0, d, e, f, 0, g, h, i, 0]
會產生下列矩陣:
第一欄 | 第二欄 | 第三欄 |
---|---|---|
a | b | c |
d | e | f |
g | 小時 | i |
注意
如色彩空間轉換矩陣中所述,請勿將來源 RGB 包含至 XYZ 或 XYZ 以目標 RGB 矩陣轉換,因為它們是由驅動程式自動處理。 目標 RGB 定義為透過顯示線傳輸色彩時所使用的編碼方式;通常 BT.709 或 BT.2020 初選。
1DLUT 定義
位元組位置 | 欄位長度(位元組) | Content | 資料類型 |
---|---|---|---|
0 到 3 | 4 | 'sf32' (73663332h) 類型簽章 | |
4 到 7 | 4 | 保留,設定為 0 | |
8 到結尾 | 變數 (0 到 16384) | 標準化為 [0.0, 1.0] 的校正 LUT 值 | s15Fixed16Number |
注意
如 Target ReGamma 中所述,此 LUT 會在傳輸函式編碼後以有線格式色彩空間運作。
注意
如果您的度量或校正曲線需要少於 4096 LUT 專案,則只儲存您實際需要的項目計數,並在 MHC2Type 結構中指定計數。 例如,最簡單的身分識別 LUT 只需要將兩個項目設定為 0.0 和 1.0。 OS 會插入硬體支持項目計數。
新的顯示 ICC 設定檔管理 API
注意
本節中的指引適用於任何顯示 ICC 配置文件,無論它是否包含 MHC 數據。
產生 MHC ICC 設定檔之後,您會在 Windows 系統上佈建目標顯示器。 在舊版的 Windows 中,您會使用 Windows 色彩系統 (WCS) 配置檔管理功能 來執行這項操作。 雖然您可以繼續使用這些現有的 API,但 Windows 10 版本 2004 會將一組新的現代化 API 新增至 WCS,專門用來管理顯示 ICC 色彩配置檔。 這些 API 都前面加上 「ColorProfile」:
- ColorProfileAddDisplayAssociation
- ColorProfileRemoveDisplayAssociation
- ColorProfileSetDisplayDefaultAssociation
- ColorProfileGetDeviceCapabilities
注意
上述 API 提供沒有現有 WCS API 對等功能的功能。
- ColorProfileGetDisplayList
- ColorProfileGetDisplayDefault
- ColorProfileGetDisplayUserScope
使用 ColorProfile API 在系統上布建 MHC ICC 配置檔的一般工作流程為:
- 使用 ColorProfileGetDeviceCapabilities 來判斷系統是否支援新的色彩轉換管線。 即使沒有,仍有助於布建配置檔以提供補充 ST.2086 元數據。
- 使用 InstallColorProfile (現有的 WCS API) 來安裝色彩設定檔。 這會將配置檔新增至可用於系統上的配置檔清單。
- 使用 ColorProfileGetDisplayUserScope 來判斷 Windows 使用者是否已覆寫系統的預設配置檔關聯,並使用自己的每個使用者關聯清單。
- 使用 ColorProfileAddDisplayAssociation 將色彩設定檔與顯示器產生關聯(讓該顯示器可選取已安裝的配置檔),並選擇性地將設定檔設定為預設值(目前使用中的配置檔)。
增強型 Windows 顯示器校正載入器
自 Windows 7 起,Windows 已提供收件匣顯示色彩校正載入器。 該校正載入器支援使用儲存在 VCGT 或 MS00 私人 ICC 配置檔標籤中的伽瑪斜坡管線資料來讀取 ICC 設定檔。 呼叫 WcsSetCalibrationManagementState,必須明確開啟 gamma 坡形載入器。
Windows 10 版本 2004 藉由新增 MHC ICC 配置檔和新色彩轉換管線的支援,來增強收件匣校正載入器。 撰寫和布建 MHC ICC 配置檔,並讓 Windows 載入器套用其狀態,是應用程式存取色彩轉換管線的唯一方法:沒有直接存取 API。 與伽瑪坡形配置檔不同,從 MHC ICC 配置檔讀取一律會啟用,因此一旦 MHC ICC 配置檔設定為已啟用系統的預設值,就會自動載入其校正狀態。
具有自動系統色彩管理的 HDR 和進階色彩案例
HDR 和自動色彩管理等新的進階色彩技術,將新功能新增至 Windows,包括優越的色彩精確度,以及存取更大的顯示器色彩範圍:如需詳細資訊,請參閱 在高/標準動態範圍顯示器上使用 DirectX 與進階色彩。
進階色彩和自動色彩管理可確保所有應用程式的一致且色彩對稱正確的顯示色彩:舊版和現代化。 不過,某些應用程式可能會使用國際色彩聯盟 (ICC) 色彩配置檔來執行自己的明確色彩管理。
當 SDR 或 HDR 顯示器上使用進階色彩時,顯示 ICC 配置檔的行為會以非回溯相容的方式變更。 如果您的 app 可與顯示 ICC 配置檔搭配運作,則 Windows 會提供相容性行為,以確保您的應用程式會繼續取得正確的行為。
如需 ICC 配置檔行為變更的相關信息,以及如何調整應用程式以最大化與進階色彩的相容性,請參閱 具有進階色彩的 ICC 配置檔行為。