Windows 硬件显示颜色校准管道

本主题介绍使用 Windows 10 版本 2004 (20H1) 及更高版本支持的新 GPU 显示颜色转换管道进行显示颜色校准。 与 GDI 伽马渐变管道 等现有路径的色彩准确度显著提升,并且添加了对 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 系列或更高版本
    • 具有 Radeon Graphics 的 AMD Ryzen 处理器
  • 英特尔:
    • 集成:Intel 第 10 代 GPU (Ice Lake) 或更高版本
    • 离散:Intel DG1 或更高版本
  • NVIDIA GTX 10xx 或更高版本 (Pascal+)
  • Qualcomm 8CX Gen 3 或更高版本;7C Gen 3 或更高版本

注意

不支持 Intel 代号 Comet Lake (5 位型号代码) 芯片集。

需要 Windows 显示驱动程序模型 (WDDM) 2.6 或更高版本驱动程序, (随 Windows 10 版本 1903) 一起发布。 某些 GPU 供应商需要更新的驱动程序,可能与随 Windows 11 版本 21H2) 发布的 WDDM 3.0 (一样新。

有关应用如何确定新的颜色转换管道在系统上是否可用的信息,请参阅 新的显示 ICC 配置文件管理 API

新的 GPU 颜色转换管道

Windows 10,版本 2004 公开了由线性伽玛颜色矩阵和 1DLUT 组成的 GPU 加速显示颜色转换管道。 与现有的 伽玛渐变 管道相比,它提供卓越的准确度、精度和支持宽色域显示。 此外,它还增加了对使用 BT.2100 信号的新技术的支持,例如 HDR 显示器。

管道不是由应用直接编程的,而是仅通过 MHC 配置文件公开;有关更多详细信息,请参阅下文。 其他操作系统 (OS) 功能(如夜间模式)也可能使用此管道,操作系统管理如何共享 (撰写) 和/或合理化多个方案之间的管道访问。

颜色转换管道说明

颜色转换管道基于颜色空间转换的标准概念模型:

框图:源 degamma、颜色矩阵、目标 regamma

模型可以在任意两个 RGB (或其他 3 通道) 颜色空间之间转换,例如 sRGB 到 P3 D65。 它还可以更正最常见的面板颜色变体类型。

Windows 颜色转换管道采用概念模型,将阶段 2 (颜色矩阵) 和 3 (目标 regamma) 扩展到子阶段,并公开阶段 (2b 和 3b 的子集,以绿色) 供应用编程,同时保留其余 (白色) 由驱动程序控制:

框图:源 degamma;颜色矩阵分解为源 RGB 到 XYZ,XYZ 到 XYZ,XYZ 分解为目标 RGB;目标 regamma 分解为电汇函数,1DLUT 调整

这些修改允许颜色管道与源内容的颜色空间无关,源内容的颜色空间可能会逐帧变化。 此外,它还改进了与显示颜色空间(如 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,它们组合在一起:

  • 3a: 将阶段 2c 中的线性 RGB 数据编码为信号通过显示线的传输函数/伽玛。

  • 3b: 在目标伽玛空间中执行任何调整,例如校准。

1DLUT 3a 由显示线格式颜色空间决定;最常见的是 sRGB 用于 SDR 显示器,ST.2084 用于 HDR 显示器。 3b 由应用编程,在应用线路格式传输函数后发生。 驱动程序组成两个 1DLUT,以生成将在硬件中执行的实际 1DLUT:

Final1DLUT = Adjustment1DLUT(TargetReGamma(input))

注意

由于驱动程序负责对显示信号传输函数进行编程,因此 (3b) 的 1DLUT 不应包含该编码。 例如,如果不调整颜色 (直通) ,则 1DLUT 应该是标识,而不考虑显示线格式的颜色空间。

阶段 4:将 (输出定向到 scanout)

这是 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”和“线路传输函数” (蓝色) 阶段来实现此目的:

标识 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 显示器广泛实现,但可用于任何显示器。 有效值为:

  • 峰值亮度 (尼特)
  • 最大全帧亮度 (尼特)
  • 最小亮度 (尼特)
  • ) xy 坐标 (RGB 颜色主色
  • 白点 (xy 坐标)

使用标准 ICC 标记描述白点、最大全帧亮度和 RGB 颜色主色。 MHC2 标记中描述了峰值和最小亮度。 配置文件必须包含所有这些信息,OS 才能接受配置文件,并将其用于高级颜色方案。

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 元数据值。

字节位置 字段长度 (字节) 内容 数据类型
0 到 3 4 “MHC2” (4D484332h) 类型签名 MHC2Type
4 到 7 4 标记数据元素开头的偏移量 uInt32Number
8 到 13 4 标记数据元素的大小 uInt32Number

MHC2Type 结构定义

字节位置 字段长度 (字节) 内容 数据类型
0 到 3 4 “MHC2” (4D484332h) 类型签名
4 到 7 4 保留,设置为 0
8 到 11 4 1DLUT 条目数 (4096 或更少) [1]
可选: 0 = 标识转换
uInt32Number
12 到 15 4 ST.2086 最小亮度(以尼特为单位) S15Fixed16Number
16 到 19 4 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 结构中的偏移量相对于结构的开头,而不是文件。

矩阵定义

字节位置 字段长度 (字节) 内容 数据类型
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 定义

字节位置 字段长度 (字节) 内容 数据类型
0 到 3 4 “sf32” (73663332h) 类型签名
4 到 7 4 保留,设置为 0
8 到结尾 (0 到 16384) 标准化为 [0.0, 1.0] 的校准 LUT 值 s15Fixed16Number

注意

Target ReGamma 中所述,此 LUT 在传输函数编码后在线路格式颜色空间中运行。

注意

如果测量或校准曲线需要的 LUT 条目少于 4096 个,则仅存储实际需要的条目计数,并在 MHC2Type 结构中指定计数。 例如,最简单的标识 LUT 只需要将两个条目设置为 0.0 和 1.0。 OS 将内插硬件支持的条目计数。

新的显示 ICC 配置文件管理 API

注意

本节中的指南适用于任何显示 ICC 配置文件,无论它是否包含 MHC 数据。

生成 MHC ICC 配置文件后,可以在 Windows 系统上针对目标显示器预配该配置文件。 在早期版本的 Windows 中,你将使用 Windows 颜色系统 (WCS) 配置文件管理功能 来执行此操作。 虽然可以继续使用这些现有 API,但Windows 10版本 2004 向 WCS 添加了一组新的现代化 API,这些 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 7 起,Windows 一直提供收件箱显示颜色校准加载程序。 该校准加载程序支持使用存储在 VCGT 或 MS00 专用 ICC 配置文件标记中的 伽玛渐变 管道数据读取 ICC 配置文件。 必须通过调用 WcsSetCalibrationManagementState 显式打开伽马渐变加载程序。

Windows 10,版本 2004 通过添加对 MHC ICC 配置文件和新颜色转换管道的支持来增强收件箱校准加载程序。 编写和预配 MHC ICC 配置文件并让 Windows 加载程序应用其状态是应用访问颜色转换管道的唯一方法:没有直接访问 API。 与 伽玛斜坡 配置文件不同,从 MHC ICC 配置文件读取始终启用,因此,一旦 MHC ICC 配置文件在支持的系统上设置为默认值,会自动加载其校准状态。

具有自动系统颜色管理的 HDR 和高级颜色方案

新的高级颜色技术(如 HDR 和自动颜色管理)为 Windows 添加了新功能,包括卓越的颜色准确性和对更大屏幕色域的访问;有关详细信息,请参阅 在高/标准动态范围显示器上使用 DirectX 与高级颜色

高级颜色和自动颜色管理可确保所有应用(包括旧版和新式应用)的一致和色度准确显示颜色。 但是,某些应用可能会使用国际颜色联盟 (ICC) 颜色配置文件执行自己的显式颜色管理。

当高级颜色在 SDR 或 HDR 显示器上处于活动状态时,显示 ICC 配置文件的行为会以非向后兼容的方式更改。 如果你的应用使用显示 ICC 配置文件,则 Windows 会提供兼容性行为,以确保你的应用继续获得正确的行为。

有关 ICC 配置文件行为的更改以及如何调整应用以最大程度地与高级颜色兼容的信息,请参阅 使用高级颜色的 ICC 配置文件行为