共用方式為


Windows 硬體顯示色彩校正管線

本主題涵蓋使用 Windows 10 版本 2004 (20H1) 和更新版本所支援的新 GPU 顯示器色彩轉換管線來顯示色彩校正。 管線可大幅改善現有路徑的色彩精確度,例如 GDI gamma 坡形 管線,並新增 HDR 顯示器的支援。

本主題適用于顯示器和電腦製造商,以及顯示想要更妥善校正其客戶顯示器的校正提供者。 大部分的 Windows 應用程式不需要執行任何動作,就能從管線獲益;但是,如果您開發受色彩管理的應用程式,您可能想要瞭解這項技術的運作方式。

如果 GPU 符合系統需求,新的色彩管線可供任何顯示器使用。 如果顯示器是 HDR 或使用自動色彩管理,則還有其他考慮和需求。 可在 高/標準動態範圍顯示器上使用 DirectX 與進階色彩中找到。

簡介

顯示色彩校正是確保顯示器正確符合其回報色彩空間的程式;例如,sRGB 或 DCI-P3 D65。 由於製造程式和其他來源的變化,個別的顯示面板可能會偏離其規格。 一旦校正顯示器,您的應用程式和內容就可以放心地以顯示器的色彩空間為目標,而不必擔心該變化性或不透明。

概括而言,顯示色彩校正包含下列步驟:

  1. 在呈現一組已知的色彩值時,執行顯示器實際色彩輸出的光學測量。
  2. 根據測量資料,產生色彩轉換,以更正顯示器中任何不透明度,並產生描述顯示結果色彩磁片區的中繼資料。
  3. 儲存色彩轉換資料並顯示中繼資料以供稍後使用。
  4. 在執行時間,將色彩轉換載入並套用至顯示框架緩衝區 (傳送至顯示) 的色彩值,並將顯示中繼資料回報給應用程式。

Windows 10版本 2004 提供步驟 3 和 4 的增強功能,而顯示製造商和校正提供者則負責步驟 1 和 2。

系統需求

新的色彩轉換管線需要可用的 GPU 和顯示器驅動程式。 支援的 GPU 架構包括:

  • Amd:
    • AMD RX 500 400 系列或更新版本
    • AMD Ryzen 處理器與 Radeon Graphics
  • 英特爾:
    • 整合:Intel 10 第 10 代 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 加速顯示色彩轉換管線,其中包含線性 gamma 色彩矩陣和 1DLUT。 相較于現有的 gamma 坡形 管線,它提供較佳的精確度、精確度,以及寬色板顯示器的支援。 此外,它也新增了對使用 BT.2100 訊號之 HDR 顯示器等新技術的支援。

管線無法由應用程式直接程式化,而是只透過 MHC 設定檔公開;如需詳細資訊,請參閱下方。 其他作業系統 (作業系統) 功能,例如夜間光線也可能會使用此管線,而 OS 會管理如何共用 (撰寫) 和/或合理化多個案例之間的管線存取。

色彩轉換管線描述

色彩轉換管線是以色彩空間轉換的標準概念模型為基礎:

區塊圖:source degamma, color matrix, target regamma

模型可以在任兩個 RGB (或其他 3 通道) 色彩空間之間轉換,例如 sRGB 到 P3 D65。 它也可以更正最常見的面板色彩變化類型。

Windows 色彩轉換管線採用概念模型、將階段 2 (色彩矩陣) 和 3 個 (目標 regamma) 展開為子階段,並公開 2b 和 3b 階段 (的子集,以綠色) 讓 app 進行程式設計,同時讓驅動程式 (白色) :

區塊圖:來源 degamma;色彩矩陣會分解成來源 RGB 到 XYZ、XYZ 到 XYZ,並將 XYZ 分解為目標 RGB;target regamma decomposed into wire transfer function, 1DLUT adjustment

這些修改可讓色彩管線與來源內容的色彩空間無關,這可能會隨著畫面對框架而變更。 此外,它可改善與顯示色彩空間的相容性,例如 BT.2100 ST.2084,這需要不透明優化才能保留精確度。

階段 0:來源 (圖形輸入)

輸入是從 OS 轉譯的框架緩衝區。 視案例而定,它可以在數個色彩空間的其中一個,包括 sRGB、sYCC、HDR10 或 scRGB,而且可以根據畫面對畫面變更。

階段 1:來源 DeGamma

顯示驅動程式會自動將來源內容轉換成線性 gamma,而且此階段無法由應用程式進行程式化。

階段 2:色彩空間轉換矩陣

在標準色彩空間轉換模型中,矩陣階段可以分成三個矩陣,這些矩陣是由 (乘以) 組成:

  • 2a: 從來源內容 RGB 色彩空間 (線性 gamma) 轉換為絕對色彩空間;在 Windows 管線中,絕對色彩空間是 CIEXYZ。

  • 2b: 在 CIEXYZ 空間中執行任何調整,例如校正。

  • 2c: 從 CIEXYZ 轉換為目標 RGB 色彩空間, (線性 gamma) 。 目標 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,這些 DLUT 會組合在一起:

  • 3a: 將第 2c 階段的線性 RGB 資料編碼為透過顯示器線傳送訊號的傳輸函式/gamma。

  • 3b: 在目標 Gamma 空間中執行任何調整,例如校正。

1DLUT 3a 是由顯示線格式色彩空間所決定;最常見的是 SDR 顯示器的 sRGB,而 ST.2084 則適用于 HDR 顯示器。 3b 可透過應用程式進行程式化,並在套用網路格式傳輸函式之後發生。 驅動程式會撰寫兩個 1DLUT,以產生在硬體中執行的實際 1DLUT:

Final1DLUT = Adjustment1DLUT(TargetReGamma(input))

注意

因為驅動程式負責程式設計顯示訊號傳輸函式,所以您程式 (3b) 的 1DLUT 不應該包含該編碼。 例如,如果您要對傳遞) (色彩執行任何調整,則不論顯示線格式色彩空間為何,您的 1DLUT 都應該是身分識別。

階段 4:將目標 (輸出設為掃描輸出)

這是要透過 GPU 透過網路掃描的框架緩衝區;在顯示器的原生色彩空間中,以及在您已進行程式設計的任何調整之後。 之後可能會進行其他作業,例如 YCbCr 編碼。

更高的精確度和精確度

Windows 10 1709 版引進線性 gamma 矩陣階段 (XYZ 至 XYZ 調整) 功能。 此功能可讓您對色彩主要和白點以及任意 RGB 色彩空間轉換執行調整。

1DLUT 調整階段在概念上類似于現有的 gamma 坡形 1DLUT,但提供改良的精確度,最多 4096 LUT 專案,最多可達 16 位固定點精確度。

注意

並非所有硬體都支援色彩管線公開的專案或精確度的完整計數。

支援 HDR (BT.2100) 顯示器

現有 gamma 坡形 管線的限制是,當顯示器使用 HDR (BT.2100 ST.2084) 訊號時,它具有未定義的行為。 新的色彩轉換管線明確支援 SDR (BT.1886 或 sRGB) 和 HDR 訊號,以及調整以支援未來的線格式色彩空間。 其會透過區塊圖中的「XYZ 到目標 RGB」和「電匯函式」 (藍色) 階段來完成此作業:

識別 xyz 以 Rgb 和電匯函式階段為目標的區塊圖

由驅動程式自動控制的這兩個階段負責將色彩編碼成線格式色彩空間:例如 sRGB 或 BT.2020 ST.2084。

因此,當您在設計色彩轉換管線時,會根據顯示器的作用中線格式色彩空間,取得妥善定義的行為。

適用于 ICC 設定檔的新 「MHC2」 標籤

Windows 不會提供 API,讓您在執行時間直接控制新的色彩轉換管線。 相反地,您的應用程式會撰寫格式正確的國際色彩聯盟 (ICC) 色彩設定檔來存取管線,並將額外的資料儲存在新的「Microsoft 硬體校正」 (「MHC2」) 私人標記中。 它是與現有 gamma 坡形 管線類似的模型,其使用 「VCGT」 私人的 ICC 標記。 具有有效 MHC2 標記資料的 ICC 設定檔稱為「MHC ICC 設定檔」或「MHC 設定檔」。

注意

MHC2 是指第二個版本的私人標記,可供所有Windows 10版本 2004 裝置使用;MHC1 隨附于具有特定 OEM 電腦的舊版 Windows 上。

補充 ST.2086 HDR 靜態中繼資料

除了設計新的色彩轉換管線之外,MHC ICC 設定檔也包含 ST.2086 HDR 靜態中繼資料。 這些值描述顯示器的動態範圍 (亮度) 和色彩色板。 它們使用 HDR 顯示器廣泛實作,但適用于任何顯示器。 值如下:

  • 尖峰亮度 ()
  • 最大全框架亮度 (nits)
  • 最小亮度 (nits)
  • (xy 座標的 RGB 色彩主要)
  • 白色點 (xy 座標)

白點、最大完整畫面亮度和 RGB 色彩主要複本會使用標準 ICC 標記來描述。 MHC2 標籤會描述尖峰和最小亮度。 設定檔必須包含此資訊,OS 才能接受設定檔,並用於進階色彩案例。

Windows 會合理化來自多個來源的 ST.2086 中繼資料,包括 MHC ICC 設定檔、圖形驅動程式和 EDID 或 DisplayID 韌體。 MHC ICC 設定檔會被視為最受信任的來源,而且會覆寫其他來源。 Windows 會透過 HDR 功能 API 公開這項資訊,如 在高/標準動態範圍顯示器上使用 DirectX 與進階色彩中所述,如此一來,HDR 應用程式就會獲得最佳的可用 HDR 顯示資訊。

可調整後光顯示器的 ST.2086 亮度定義

顯示器可能會有可調整的倒光燈,例如由使用者控制,或由環境光線感應器自動控制。 這會導致 ST.2086 亮度值如何解譯模棱兩可。

若為 Windows 控制膝上型電腦和整合式面板裝置) 的反光 (,則當此作業系統控制的反光燈上限或最亮設定時,必須描述亮度值。

對於 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 () 的 Chromaticity
greenColorantTag XYZNumber 綠色主要複本 xy () 的 Chromaticity
blueColorantTag XYZNumber 藍色主要複本 xy () 的 Chromaticity
mediaWhitePointTag XYZNumber 白色點 xy () 的 Chromaticity
luminanceTag XYZNumber 最大全框架亮度 亮度 (nits)

「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 (4096 或更少) 1DLUT 專案的數目 [1]
選擇性: 0 = 身分識別轉換
uInt32Number
12 到 15 4 ST.2086 nits 中的亮度下限 S15Fixed16Number
16 到 19 4 NIts 中的 ST.2086 尖峰亮度 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 到 23 24 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 h 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 Color System (WCS) 設定檔管理功能 來執行這項操作。 雖然您可以繼續使用這些現有的 API,Windows 10 2004 版會將一組新的現代化 API 新增至 WCS,這些 API 專門用來管理顯示 ICC 色彩設定檔。 這些 API 全都前面加上 「ColorProfile」:

  • ColorProfileAddDisplayAssociation
  • ColorProfileRemoveDisplayAssociation
  • ColorProfileSetDisplayDefaultAssociation
  • ColorProfileGetDeviceCapabilities

注意

上述 API 提供沒有現有 WCS API 對等的功能。

  • ColorProfileGetDisplayList
  • ColorProfileGetDisplayDefault
  • ColorProfileGetDisplayUserScope

使用 ColorProfile API 在系統上布建 MHC ICC 設定檔的典型工作流程為:

  1. 使用 ColorProfileGetDeviceCapabilities 來判斷系統是否支援新的色彩轉換管線。 即使沒有,布建設定檔仍可能很有説明,以提供補充的 ST.2086 中繼資料。
  2. 使用 InstallColorProfile (現有的 WCS API) 來安裝色彩設定檔。 這會將設定檔新增至可用於系統上的配置檔案清單。
  3. 使用 ColorProfileGetDisplayUserScope 來判斷 Windows 使用者是否已覆寫系統的預設設定檔關聯,並使用自己的個別使用者關聯清單。
  4. 使用 ColorProfileAddDisplayAssociation 將色彩設定檔與顯示關聯 (讓已安裝的設定檔可供選取該顯示) ,並選擇性地將設定檔設定為預設設定檔, (目前作用中的設定檔) 。

增強型 Windows 顯示器校正載入器

Windows 已提供自 Windows 7 起的收件匣顯示色彩校正載入器。 該校正載入器支援讀取包含儲存在 VCGT 或 MS00 私人 ICC 設定檔標籤中的 GAMMA 坡形 管線資料之 ICC 設定檔。 呼叫WcsSetCalibrationManagementState,必須明確開啟gamma坡形載入器。

Windows 10版本 2004 藉由新增 MHC ICC 設定檔和新的色彩轉換管線支援,來增強收件匣校正載入器。 撰寫和布建 MHC ICC 設定檔,並讓 Windows 載入器套用其狀態,是應用程式存取色彩轉換管線的唯一方法:沒有直接存取 API。 不同于 gamma 坡形 設定檔,一律會啟用從 MHC ICC 設定檔讀取,因此一旦在支援系統上將 MHC ICC 設定檔設定為預設值,就會自動載入其校正狀態。

具有自動系統色彩管理的 HDR 和進階色彩案例

新的進階色彩技術,例如 HDR 和自動色彩管理,可將新功能新增至 Windows,包括更佳的色彩精確度,以及更大型的顯示色彩遊戲存取權;如需詳細資訊,請參閱 在高/標準動態範圍顯示器上使用 DirectX 搭配進階色彩

進階色彩和自動色彩管理可確保所有應用程式的一致且色彩對稱正確的顯示色彩:舊版和現代化。 不過,某些應用程式可能會使用國際色彩聯盟 (ICC) 色彩設定檔來執行自己的明確色彩管理。

當 SDR 或 HDR 顯示器上使用進階色彩時,顯示 ICC 設定檔的行為會以非回溯相容的方式變更。 如果您的 app 適用于顯示 ICC 設定檔,則 Windows 會提供相容性行為,以確保您的應用程式會繼續取得正確的行為。

如需有關對 ICC 設定檔行為的變更,以及如何調整應用程式以最大化與進階色彩的相容性,請參閱 使用進階色彩的 ICC 設定檔行為