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 第 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 加速的显示颜色转换管道,其中包含线性伽玛色矩阵和 1DLUT。 与现有的 伽玛渐变 管道相比,它提供卓越的准确度、精度和支持宽色域显示。 此外,它还增加了对使用 BT.2100 信号的新技术(如 HDR 显示器)的支持。

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

颜色转换管道说明

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

块图:源 degamma,颜色矩阵,目标regamma

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

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

块图:源 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

显示驱动程序会自动将源内容转换为线性伽玛,并且此阶段无法由应用进行编程。

阶段 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,这些 RGB 1DLUT 组合在一起:

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

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

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

Final1DLUT = Adjustment1DLUT(TargetReGamma(input))

注意

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

阶段 4:目标(输出到扫描)

这是 GPU 通过网络扫描的帧缓冲区;在显示器的本机颜色空间中,并且经过任何调整后,你已编程。 之后可能会发生其他操作,例如 YCbCr 编码。

更高的精度和准确性

线性伽玛矩阵阶段(XYZ 到 XYZ 调整)功能是在 Windows 10 版本 1709 中引入的。 此功能使你可以对颜色初选和白点以及任意 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 随附于早期版本的 Windows 上,其中包含特定的 OEM 电脑。

补充 ST.2086 HDR 静态元数据

除了对新的颜色转换管道进行编程外,MHC ICC 配置文件还包含 ST.2086 HDR 静态元数据。 这些是描述显示动态范围(亮度)和色域的值。 它们通过 HDR 显示器广泛实现,但对于任何显示都很有用。 有效值为:

  • 峰值亮度 (尼茨)
  • 最大全帧亮度(尼茨)
  • 最小亮度 (尼茨)
  • 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 规范中找到标记和数据类型定义。

标记名称 Data type 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 元数据值必须填充有效数据。

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

MHC2Type 结构定义

字节位置 字段长度(字节) 内容 Data type
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 结构中的偏移量相对于结构的开头,而不是文件。

矩阵定义

字节位置 字段长度(字节) 内容 Data type
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 h i

注意

如颜色空间转换矩阵中所述,不包括源 RGB 到 XYZ 或 XYZ 以目标 RGB 矩阵转换,因为它们由驱动程序自动处理。 目标 RGB 定义为在显示线路上传输颜色时使用的编码;通常为 BT.709 或 BT.2020 初选。

1DLUT 定义

字节位置 字段长度(字节) 内容 Data type
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 向 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 配置文件行为。