导言
消费电子的推陈出新的战火烧到了显示器领域,高刷新率、高分辨率、广色域的面板已经普及,在成像效果方面有了显著的提升。虽然显示设备的硬件已经达到了新高度,但其使用体验,尤其是在色彩还原方面,并没有取得应有的提升。例如,不时能看到用户抱怨显示器「色彩过于浓郁,尤其是红色和蓝色,长期使用累眼睛」。导致这些问题的原因在于厂商以及操作系统没有做好适配,使得面板本身优秀的显示素质无从发挥,用户体验大打折扣。
听到了用户在「色彩还原」方面的抱怨,第三方厂商从各自的角度推出了相应的“解决方案”,但这些方案要么严重过时,要么就仅仅是在回避问题,不能作为整体性的解决方案:
- 微软早在Windows 2000时代就推出了Windows Color System——一套操作系统层面的色彩管理API。然而这套API需要应用程序主动去适配,极大地限制了其可用性。就连自家的Windows桌面都没有用上WCS,更不用说第三方软件了。此外,因为推出时间早,WCS的设计已经过时,想要在当今设备上取得较好的「色彩还原」效果需要下大功夫,除了像Adobe这样深耕图像处理多年的软件开发商,很少有人愿意投入这样多的资源;
- 除了操作系统,显卡驱动程序也或多或少的提供了一部分色彩管理功能。这是因为显卡驱动程序在显示数据被送往显示器之前对其进行统一处理,从而提供全局的解决方案。例如,AMD用户可以通过Adrenalin进行色域缩限(Gamut Clamping),强制使用sRGB色域。NVIDIA用户也可使用第三方的novideo_srgb指定色域缩限的目标。相比于WCS,这两个方案解决不需要程序主动适配,解决了可用性的问题。但色域缩限的解决方式白白浪费了面板优秀的显示素质。此外,是否提供该功能在很大程度上依赖厂商的良心:目前仅有AMD在官方驱动中提供了该功能。NVIDIA用户尚且可以通过
novideo_srgb
去曲线救国,Intel和Qualcomm用户就只能自求多福了 - 作为显示管线的末端,显示设备制造商也提供了色域缩限功能。例如Dell、LG等厂商均在其显示器的OSD菜单中提供了多种色彩模式,根据用户选择的不同进行色域缩限。与驱动程序提供的色域缩限的优缺点类似,该方案在具有全局性的同时也在一定程度上浪费了面板的显示素质。此外,部分厂商提供的色域缩限功能或多或少存在问题。以最常见的sRGB色域为例,有些显示器开启该模式后亮度固定不可调,严重影响了使用体验。
此外,上述方案是操作系统、显卡生产商、显示器站在自己的角度独自提出的,缺乏配合,稍有不慎就会取得意想不到的效果。例如,同时开启显卡驱动和显示器的色域缩限后会发生二次缩限(Double clamping),导致色彩欠饱和。
天下苦色彩管理久矣,微软在Windows 10中提供了增强版的色彩管理:这一版本的色彩管理仅对非广色域内容进行色域缩限,广色域内容则不做处理,以尽可能保留面板的成像素质。然而,该色彩管理模式仅支持高动态范围(High Dynamic Range,以下简称HDR)显示器,标准动态范围(Standard Dynamic Range,以下简称SDR)的显示器则仍然处于水深火热之中。好在微软迷途知返在Windows 11 22H2中为标准动态范围(Standard Dynamic Range,以下简称SDR)提供了系统层面的增强的色彩管理,解决了这个老大难问题。
本文中所用到的术语解释如下:
-
色域(Color Gamut):色域是指某个设备或系统可以显示或再现的所有颜色范围。它由一组特定的颜色组成,通常用三原色(红、绿、蓝)的混合来表示。色域可以用三维空间中的图形表示,其中每个点代表一个特定的颜色。常见的色域包括sRGB、Adobe RGB和DCI-P3等,每个色域都有其特定的颜色范围,并且均不相同
-
标准色域(Standard Color Gamut):标准色域(Standard Color Gamut)是指一组普遍被接受和广泛应用的颜色范围,它用于在各种设备和系统上显示和处理图像。目前最常见的标准色域之一是sRGB,其被广泛用于呈现互联网中的数字内容。
-
广色域(Wide Color Gamut):广色域是相对于标准色域而言的,它表示设备或系统能够显示更大范围的颜色。广色域的显示设备可以覆盖更多的颜色范围,可以呈现更丰富、更鲜艳。
-
色彩管理(Color Management):色彩管理是一种用于确保图像和色彩在不同设备和系统中一致显示的技术。由于不同的设备和显示器可能具有不同的色域和色彩特性,这可能导致在不同设备上显示的图像颜色有所偏差。为了解决这个问题,色彩管理系统使用色彩配置文件来记录每个设备的色域和色彩特性,并在图像显示时进行色彩转换,以使得图像在不同设备上能够保持一致的色彩表现。过去,色彩管理主要被用于在专业图形设计、摄影和印刷等领域确保图像的色彩准确性和一致性。如今随着广色域显示器的普及,色彩管理已经成为了不可缺少的功能。
下表中展示了目前Windows中在动态范围和色域覆盖两个维度上提供的色彩管理API,本文的关注点是SDR中广色域屏幕的色彩管理。具体而言,本文将介绍开启SDR中的该增强色彩管理的步骤,对一些软件(如浏览器、播放器)的配置过程,并对开启色彩管理前后的效果进行对比。
高动态范围(HDR) | 标准动态范围(SDR) | |
---|---|---|
标准色域(色域覆盖<sRGB) | Windows Color System( |
Windows Color System(since Windows 2000) |
广色域(色域覆盖>sRGB) | Advanced Color(since Windows 10) | Advanced Color(since Windows 11) |
为什么需要色彩管理
Q:为什么需要色彩管理?
A:因为以RGB为基础的颜色表示方法表示的是相对值。当色域的绝对边界不一致时,基于相对值的颜色表示方法就无法表示原有的语义
以RGB888为例,在该定义下,R、G、B中每个频道被8位的整数表示。我们仅考虑红色,对于红色RGB(x,0,0)
,其含义如下:
- 找到该定义中最红的点(即
RGB(255,0,0)
,以它距白点(即RGB(0,0,0)
)的距离为单位“1” - 找到单位“1”上的
x/255
分位点,该点即为RGB(x,0,0)
所表示的色彩
由此可知,RGB888所表达的颜色是一个相对于单位“1”的相对值,而该单位“1”就是色域的绝对边界。那么色域的绝对边界一致吗?答案显而易见:不一致
下图将各个色域的覆盖范围投影到了CIE 1931 xy,一个基于可见光谱的绝对色彩空间。可见sRGB色域覆盖的红色范围明显小于P3色域覆盖的红色范围。对于同样的RGB(255,0,0)
,其在P3色域中的坐标要比sRGB色域的坐标更靠右下,即更红。对于位于色域覆盖三角形上方的绿色,该结论也成立。考虑到大多数图像以sRGB色域为基准,若不对RGB值进行相应处理,在P3色域中直接展示图像则色彩就会失真,即色彩失去了其语义。
现代操作系统所提供的渲染管线由应用程序开始,其调用操作系统提供的图形API与显卡厂商提供的显示驱动程序交互,并通过驱动程序写入显存,再由显卡将其信号送入显示器中。作为硬件管理者,操作系统应当屏蔽掉硬件在各个层面的差异,提供高层级的抽象,以简化应用开发者的负担。此外,操作系统通常是最强势的一方,实现色彩管理是其义不容辞的责任。当然,色彩管理需要多个部件协同配合,因此操作系统会对显卡、驱动程序、显示设备有一系列的要求。Windows 11中引入的自动色彩管理也不例外
前置条件
- 操作系统:Windows 11 22H2 (10.0; Build 22621)
- 驱动程序:WDDM 版本≥3.0
- GPU:
- AMD:
- 桌面端:Radeon RX 400系列或更新
- 移动端:锐龙APU
- Intel
- 集成显卡:12代 (Alder Lake)或更新
- 独立显卡: Intel DG1或更新
- NVIDIA:
- NVIDIA GTX 1000系列或更新
- AMD:
- 显示器:
- 色域覆盖:超过100% sRGB的屏幕,例如100% DCI-P3
- 不支持全局HDR10输出(HDR下的色彩管理由Windows 10引入,其效果完全依赖显示器生产商的调教)
开启自动色彩管理
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers
- 右键添加DWORD值
EnableAcmSupportDeveloperPreview
并置为1
。 - 重启电脑
- 打开设置->系统->显示->高级显示设置->自动管理应用的颜色
- 参阅本文「相关BUG」部分的后续步骤
打开色彩管理后,显示属性的位深由8-bit
变为8-bit with dithering
,带上了抖动(Dithering),如图所示。
这是因为DWM提高了计算精度,使用FP16对桌面进行混成,而不是RGB888。高精度色彩计算时引入随机抖动可以避免色带(Banding)的产生。
ACM also allows new and updated apps to render more colors while preserving color accuracy, providing extra detail and fewer color artifacts for content such as gradients and shadows/dark tones. Without ACM, the DWM (Desktop Window Manager) restricted windowed apps to output content at only 8 bits per color channel, even if the display supported a higher bit depth. When ACM is enabled, the DWM performs its composition using IEEE half-precision floating point (FP16), eliminating any bottlenecks, and allowing the full precision of the display to be used. With ACM, apps can access billions of colors with 10-16 bits of precision, and even on displays that only support 8-bit precision, ACM unlocks additional quality using techniques such as dithering.
PS,能够进行高精度色彩计算也是MadVR被称为「史上最强渲染器」的原因之一。
效果
测试所用设备是HP Elitebook 845g10
,它自带了一块100% DCI-P3的屏幕。因Windows上的截图软件尚未支持广色域,所有对比图片均采用固定ISO和快门时间的相机拍摄。
首先看看原生不支持色彩管理的Windows桌面。开启了色彩管理之后的效果如下图所示
默认关闭色彩管理的效果如下图
主要的区别在于红色部分(如标有“39”的气球、喇叭)和蓝色部分(如Miku的头发、裙子)。从图上看似乎默认关闭色彩管理的显示效果更讨人喜欢,那么真的如此么?答案并非如此。以标称100% sRGB色域覆盖的HP Elitebook 845g7和Dell U2412M为基准,图中的红色和蓝色严重过饱和,甚至到了影响使用的程度。而对比开启色彩管理后的显示效果,几乎没有区别。得出结论:ACM能够正确处理原生不支持色彩管理的软件,对超出sRGB的颜色进行正确的缩限。
接下来看一个支持WCS色彩管理的程序——Microsoft Edge。开启ACM后WCS的行为发生变化,因此需要调整其配置。
进入 about:flags 页面,搜索 #force-color-profile ,设置为 scRGB linear (HDR where available) 即可在Edge浏览器里正确输出广色域图片。设置完成后可以在
wide-gamut.com
提供的测试页面进行测试
下图是对超出sRGB覆盖色彩的测试,可以看到一个“W”字母,这表明Microsoft Edge能够正确的展示带有标记的广色域图片。
下图展示了同样RGB值图片的呈现效果。tagged表示Metadata中声明了该图片的色域。ProPhoto是一个比sRGB覆盖面积更大的色彩空间。由图可见可见上下两部分存在差别。事实上裸眼可视的区别比照片中呈现的更为明显,这表明笔者该换相机了
下图展示了sRGB图片在是否声明色域时展示效果的对比,可见是否声明色彩空间对呈现效果没有影响。
结论:以Microsoft Edge为代表的一系列基于WCS的应用程序在开启ACM后能够正确的展示广色域与标准色域的图片,并且对未声明色域的图片能够按照sRGB处理。
综上所述,开启ACM后Windows渲染管线可以正确处理颜色:
- 对于不支持色彩管理的程序,ACM假定其输出为sRGB色彩空间,并且能够按照显示器的实际色彩空间进行缩限
- 对于本身支持色彩管理的程序,ACM不对其输出进行处理(其实还是处理了,只是其目标色彩空间scRGB的覆盖范围远大于常见色彩空间),由应用程序自身进行色彩管理,在程序正确实现的情况下,可以正确显示广色域与非广色域的内容,全面榨干面板的色彩还原能力。
一些BUG
笔者在使用ACM的一周多时间中遇到了一些问题,记录如下。需要注意的是截至2023年7月23日,AMD尚未提供笔者显卡(780m)的正式版驱动,ACM目前也处于预览状态,因此无法确定如下的解决方案是否具有通用性。
重启后ACM失效
现象
打开ACM后重启电脑,尽管系统显示ACM已经启用,但(对于不支持色彩管理的程序)并未启用色域缩限。
解决方法1:
每次重启后将ACM关闭再打开。重开解决大部分问题.jpg
解决方法2:
启用AMD Adrenalin自带的色域缩限功能。具体步骤为: 启动AMD Adrenalin->点击右上角齿轮图标(Settings)->切换至显示(Display)选项卡->打开自定义色彩(Custom Color)后关闭色温控制(Color Temperature Control)
需要注意的是若本次开机后重新打开过ACM则不要使用该解决方法,这会导致双重缩限,即欠饱和。
渲染出错
问题描述
Microsoft Edge和Mozilla Firefox在使用过程中有时会出现色块,且颜色不正常
解决方法
刷新页面。若无效则重启进程
MadVR未进行色域缩限
问题描述
使用MadVR渲染视频sRGB内容时未进行色域缩限
解决方法
在MadVR的选项中找到显示器,在校准(Calibration)选项卡中选择「此显示器已被校准(This display is already calibrated」;在「该显示器被校准于如下色域(This display is calibrated to the following primaries/gamut)」中选择「BT.709」(即sRGB)。
终于可以好好看个魔法未来了
其他
Windows上色彩管理的发展史与DPI缩放(DPI awareness)何其相似:
- 远古时代,大家默认DPI就是96(sRGB),不存在DPI缩放(Unaware)和色彩管理的需求。
- 文艺复兴时代,高分屏(广色域屏)开始出现,Windows加入了系统层面的缩放支持和(色彩管理),也提供了对应的API。这些机制(System aware vs WCS)需要应用主动适配,难用,也难普及。
- 现代(?),多显示器的组合开始出现,各自的缩放比例(色域覆盖)各不相同,应用程序在其运行过程中可能在多个显示器间来回切换,需要系统提供进一步的支持(Per-Monitor aware vs ACM)以正确实现缩放(色彩管理)
色彩管理和DPI缩放发展到今天很难说已经完善。在新的应用场景出现时希望M$好自为之,别再装死了
PS,色彩管理这么大的更新都不刷一下NT的版本号么?被三体人锁死在NT 10.0了?
笔者在折腾色彩管理以及本文的写作过程发现相比于其他问题的资料,Windows上色彩管理相关的资料上少了好几个数量级,几乎找不到系统性的文字资料,难解笔者心头之疑惑。读者如有相关文字材料也可分享给笔者,共同交流进步。作者能力有限,存在疏漏在所难免,也欢迎读者批评指正。