使用高级颜色的 ICC 配置文件行为
高级颜色是 OS 技术的一个伞式术语,其颜色保真度明显高于标准显示器。 有关详细信息,请参阅 在高标准动态范围上将 DirectX 与高级颜色配合使用。 高级颜色和自动颜色管理可确保所有应用的一致且具有色度准确的显示颜色:旧版和现代应用。 但是,你的应用可能已经使用国际颜色联盟(ICC)颜色配置文件执行自己的显式颜色管理。
当高级颜色在 SDR 或 HDR 显示器上处于活动状态时,以非向后兼容方式更改显示 ICC 配置文件的行为。 如果你的应用适用于显示 ICC 配置文件,则 Windows 提供兼容性帮助程序,以确保你的应用继续获得正确的行为。 高级颜色感知应用应从与显示 ICC 配置文件直接交互过渡,因为 Windows 提供替换面向应用的 API 来抽象掉配置文件;在高标准动态范围上将 DirectX 与高级颜色配合使用时提供完整指南。
本主题介绍 ICC 配置文件行为的更改。 此外,如果你的颜色托管应用需要继续使用显示 ICC 配置文件,本主题将演示如何调整应用以增量方式利用高级颜色优势。
旧版 Windows 颜色管理行为
当高级颜色处于非活动状态时,Windows 不会对应用的视觉内容输出执行任何颜色管理(例如,GDI hDC、DirectX 交换链或合成视觉对象):实际上,它假定应用内容位于标准 sRGB 颜色空间中。 如果要在活动显示器上准确复制颜色,则你的应用必须执行自己的颜色管理,通常使用国际颜色联盟(ICC)颜色配置文件。 主要概念步骤包括:
- 获取显示的颜色特征。
- 执行颜色空间转换为显示器的颜色空间。
- 执行域映射以限制显示域。
下面是有关这三个步骤的更多详细信息。
获取显示的颜色特征
Win32 应用使用 Windows 颜色系统配置文件管理功能 来获取默认的 ICC 配置文件,该配置文件告诉你显示的颜色特征,包括其可用的颜色域。
通用 Windows 平台应用改用 DisplayInformation.GetColorProfileAsync 方法。
执行颜色空间转换为显示器的颜色空间
如果显示器的颜色空间与内容的颜色空间不匹配,则必须执行颜色空间转换。 例如,数字内容通常编码为 sRGB,但显示器可能是宽域 DCI-P3。 你通常会使用一个 ICC 颜色管理库来读取 ICC 配置文件,并转换内容的颜色值以匹配。 Windows 提供多个 ICC 颜色管理引擎;例如,Direct2D 颜色管理效果。
请务必注意,基于 ICC 的基于配置文件的颜色管理 显示引用 或 输出引用。 这意味着颜色值不存储为绝对(场景引用)颜色,而是相对于显示器的颜色空间(输出设备)进行编码。 例如,如果应用呈现 sRGB 红色,则表示为呈现输出中的 RGB(1, 0, 0)
。 但是,如果要在 Adobe RGB 显示器上呈现该内容,则 RGB(1, 0, 0)
只是被显示器解释为其最饱和的红色(Adobe RGB 红色),这是不正确的。 应用 ICC 颜色转换时,它将重新将颜色编码为 RGB(0.858659, 0, 0)
,当该颜色由 Adobe RGB 显示器呈现时,它将正确重现为 sRGB 红色。
执行域映射以限制到显示器的域
除了重新解释颜色值以匹配显示的颜色空间外,还需要处理显示无法以物理方式重现内容中所有颜色的情况:如果内容的颜色域大于显示器,则为 此过程称为域映射。
游戏映射是丢失的,因为你必须权衡如何近似于内容更大的范围。 最直接的方法是着色,其中保留显示域内的颜色,而从域外的颜色被剪裁到最接近的域内值。
在基于 ICC 配置文件的工作流中,游戏映射通常在颜色管理库中自动处理。 可以通过选择呈现意向来控制映射行为(请参阅 呈现意向模式)。
注意
当你处于高级颜色工作流中时,我们通常不建议对源或目标使用感知呈现意向,因为它是针对 SDR 源和颜色域比 HDR 和某些 WCG 显示器更小的 SDR 源和目标设计的:因此,使用它们可能会导致意外行为。
Windows 自动系统颜色管理
当高级颜色处于活动状态时,Windows 会执行自动系统颜色管理 - 它可确保你的应用的颜色内容在显示器上准确重现。 这极大地简化了应用所需的作,尽管高级应用可能会继续执行其他处理,以获得最大颜色和感知准确性。 有关详细信息,请参阅 在高标准动态范围上将 DirectX 与高级颜色配合使用。
获取显示的颜色特征
高级颜色感知应用不应直接与显示 ICC 配置文件交互。 相反,可以使用 DisplayInformation::GetAdvancedColorInfo 或 IDXGIOutput6获取显示的颜色属性。
执行颜色空间转换为显示器的颜色空间
Windows 将执行颜色空间转换为由当前默认颜色配置文件确定的显示颜色空间。 如果没有配置文件,将使用 EDID 着色数据。 应用会自动 场景引用 颜色行为(例如,如果将 sRGB 红色编码为 RGB(1, 0, 0)
呈现并显示给 Adobe RGB 监视器,则 Windows 会将它正确重现为 sRGB 红色。 高级颜色感知应用应使用正确的颜色空间标记其内容,以使用 IDXGISwapChain3::SetColorSpace1通知 Windows。 对于呈现为标准整数像素格式(例如 8 位 RGBA)的所有非高级颜色感知应用,Windows 将显式将应用视为 sRGB。 如果要在高级颜色方案中呈现 AdobeRGB 红色,则需要在 scRGB 标记图面中呈现 RGB(1.158157,0,0)
(它受显示器的域约束)。
执行域映射以限制到显示器的域
GPU 的显示管道将对色外颜色执行数值剪辑。 如果你的应用希望使用更复杂的映射,则需要自行执行此作。
使用高级颜色的 ICC 配置文件默认行为
自动系统颜色管理必然影响现有基于 ICC 配置文件的应用的行为方式,因为它们正在执行作系统(OS.)Windows 现在处理的许多作,因此将默认行为(如下所述)应用于基于 ICC 配置文件的应用。 这可确保这些应用的行为不正确。 但是,如果没有进一步的工作,他们将无法访问任何扩展的颜色功能。
具体而言,默认情况下,基于 ICC 的配置文件应用仅限于 sRGB 域,即使监视器实际上范围更广。 Windows 还提供 ICC 兼容性帮助程序,可让你的 ICC 应用访问显示器的整个游戏。 有关详细信息,请参阅本主题中的 显示 ICC 配置文件兼容性帮助程序 部分。
获取显示的颜色特征
当高级颜色处于活动状态时,任何调用颜色配置文件管理 API 以获取显示的默认配置文件都将返回“无配置文件”,而不考虑实际安装的配置文件。 按照约定“无配置文件”应解释为 sRGB。
显示 ICC 配置文件仍然有效且与高级颜色一起使用,但它们仅在系统级别使用,并且大多数应用不应直接与它们交互。 仅当应用是枚举所有显示配置文件或正在创作/安装配置文件的实用工具时,通常才需要以下信息。
若要强制实施,Windows 将添加 STANDARD
和 EXTENDED
颜色配置文件子类型的概念。 这适用于使用 COLORPROFILESUBTYPE的任何颜色配置文件管理 API:
CPST_STANDARD_DISPLAY_COLOR_MODE
CPST_EXTENDED_DISPLAY_COLOR_MODE
注意
STANDARD
和 EXTENDED
子类型不是存储在配置文件本身中的属性;相反,它们适用于配置文件的关联到显示(即,将配置文件添加到显示器的配置文件关联列表时)。 单个配置文件可以同时与显示器的 STANDARD
和 EXTENDED
子类型相关联,这意味着该配置文件可用于标准和高级颜色方案。
显示要在 SDR 中使用的配置文件关联(无论是常规 SDR 还是高级颜色 SDR)具有子类型 STANDARD
(如果未指定任何值,则为默认值)。 在 HDR 模式下使用的显示配置文件关联是子类型 EXTENDED
。 如果应用未指定子类型,则会将其解释为 STANDARD
。
使用 COLORPROFILESUBTYPE 的任何 getter API 将仅返回具有匹配 STANDARD
或 EXTENDED
子类型的配置文件。 例如,如果 HDR 处于活动状态,则 EXTENDED
子类型的唯一显示配置文件有效,并且不使用 STANDARD
子类型配置文件。
Setter API 可以指定子类型(STANDARD
为默认值)。
执行颜色空间转换为显示器的颜色空间
由于 ICC 配置文件管理 API 在“高级颜色”处于活动状态时返回 sRGB,因此基于 ICC 配置文件的应用将颜色管理为 sRGB,Windows 会将该应用正确重现为屏幕上的 sRGB。
执行域映射以限制到显示器的域
保留任何现有的域映射行为。
显示 ICC 配置文件兼容性帮助程序
当高级颜色处于活动状态时,Windows 为显示 ICC 配置文件提供兼容性帮助程序,用于提供对显示器整个游戏的访问权限。 这样,你的应用将继续获得准确且宽广的色域颜色,直到显示报告的功能,这与目前在旧版非高级颜色模式下校准的宽域监视器上提供的功能相同。 如果没有该帮助程序,你的应用将仅限于默认行为,即 sRGB(请参阅 高级颜色的 ICC 配置文件默认行为)。
该帮助程序从 Windows 11 开始可用。 它不提供高级颜色的其他优势,包括访问更高的精度/位深度或高动态范围 - 你需要将应用修改为高级颜色感知。
启用显示 ICC 兼容性帮助程序
显示 ICC 兼容性帮助程序基于每个应用启用。 默认情况下,它未启用。
用户可以通过转到可执行文件属性的“兼容性”选项卡并选择 “使用旧版显示 ICC 颜色管理”来为应用启用它。 兼容性帮助程序将应用于整个进程,并且仅在为显示器启用高级颜色时处于活动状态-它不会影响标准 SDR 显示器。
Windows 会自动为已知使用 ICC 颜色配置文件管理的某些常用应用启用帮助程序。
无法以编程方式为应用启用该兼容性帮助程序。
获取显示的颜色特征
如果兼容性帮助程序处于活动状态,则当应用使用 Windows 颜色系统配置文件管理功能查询默认 STANDARD
颜色配置文件时,Windows 将使用填充高级颜色显示功能 API 的相同数据构建合成 ICC 配置文件。 合成配置文件的数据可以来自当前颜色配置文件、显示 EDID 或 DisplayID 或其他来源的组合。
如果你的应用查询默认 EXTENDED
颜色配置文件,则表明你的应用具有高级颜色感知,并且它将收到实际的 EXTENDED
配置文件。
执行颜色空间转换为显示器的颜色空间
如果兼容性帮助程序处于活动状态,则你的应用应使用 ICC 颜色管理来面向合成显示配置文件。 Windows 假设你的应用面向该颜色空间,并将执行正确的颜色空间转换,以确保它在显示器上准确呈现。
颜色空间转换适用于整个应用过程,因此所有应用的视觉内容都被视为面向显示的颜色空间,即使其中一些不是颜色管理,并且名义上面向 sRGB(例如 UI)。 无论图形 API(GDI、DirectX、XAML 等)、像素格式或其他呈现内容的特征如何,颜色空间转换也会应用。
执行游戏映射以限制到显示器的域
保留任何现有的域映射行为。
用户可见的行为更改
用户可以通过检查其兼容性属性选项卡来验证显示 ICC 兼容性帮助程序是否对可执行文件处于活动状态。如果你的应用显示有关默认显示 ICC 配置文件的信息,则用户会看到它是综合配置文件。 配置文件的描述性内容(包括名称)是实现详细信息。
实际颜色行为应与禁用高级颜色时相同。 在这两种情况下,你的应用都会呈现准确的颜色,这些颜色可以访问显示器的完整范围,如 ICC 配置文件所述。