|
本帖最后由 boday 于 2023-2-25 13:16 编辑
我把我前面说的展开详细说一下。下面大部分内容我猜你已经知道,但看起来你还是有些误解。
我们现在手里的 ICC color profile 文件里面一般包含了两个部分:
- 校正曲线(calibration curves),也叫 VCGT(video card gamma table);
- 真正的 ICC color profile,可以是 matrix 或者 LUT 形式。
最初 ICC color profile 文件的定义里没有第一部分,是后来苹果给加进去的,然后大家都这么用了。
校正曲线本身是一个极为简化了的、不完整的色彩管理方式。它的优点在于简单省事,直接载入到显卡就可以直接影响所有经过该显卡输出内容的颜色;而缺点则在于它只能提供很有限的调整(亮度、gamma、白点等),不能达到色彩管理的根本目的(不能进行色域的转换)。
我们把校色仪挂在显示器上校色的时候,也是一样分成了两个步骤:
- 校正(calibration),就是先让显示器达到某个确定的亮度、gamma 和白点——通常先用显示器自带的调节(如果有的话),然后再生成一组校正曲线,把这组曲线载入显卡,让显示器尽可能接近我们指定的亮度、gamma 和白点;
- 特性化(profiling),就是通过一系列测量,生成一个对这台显示器特性的描述,即 ICC color profile。这一步是在前一步的基础上进行的。
因此,我们必须要拿到一组匹配的校正曲线和 ICC profile 放在一起,才是对这台显示器的一个完整的、正确的特性描述。
(当然,校正这个步骤是可以跳过的。那样的话只需要 ICC profile 就够了。不过这就不是本帖要讨论的问题了。)
----------------------------------------------------------------------------------------------------
现在你给自己显示器校色。
在第一步的校正里,你分别指定了两个不同的 gamma:2.2 和 2.4,得到了校正曲线 C1 和 C2。
然后第二步,分别在显示器被校正到 gamma 2.2 和 2.4 的基础上,你进行了 profiling,得到了 profile P1 和 P2。
无论是 C1+P1,还是 C2+P2,都是对你显示器完整的、正确的特性描述。
利用任何一个组合,一个支持完整色彩管理的应用程序(如 mpv),都可以输出正确的结果。
回想一下,色彩管理的根本目的是让不同显示设备间的颜色一致。既然如此,它也就不应该和你把显示器“校正”到某个指定的“标准”(如 gamma 2.2)有关。
校正曲线是直接载入到显卡的。应用程序(如 mpv)不知道也不在乎校正曲线,它只会默认你已经载入了正确的校正曲线,用与之匹配的 ICC profile 做颜色转换。
因为一套匹配的校正曲线和 ICC profile 是保存在同一个文件里的,所以如果指定了一个文件,我们就可以得到正确的结果。
如上所述,你载入 C1 然后让 mpv 自动使用 P1,和载入 C2 然后让 mpv 自动使用 P2,你眼睛看到的结果应该是一样的(但截图就会不一样了)。
但是如果你始终载入的是 C1,手动指定 P2 给 mpv,那结果就是错误的了。是的,mpv 会直接忽略你指定的文件里的校正曲线部分。
如果一定想验证一下的话,可以用 DisplayCAL 分别拿你的两个 ICC profile 文件各自生成一个给 madVR 用的 3D LUT(当然,记得勾选 apply calibration,把校正曲线整合进去),然后在 madVR 设置里确保勾选 disable GPU gamma ramps,分别设置两个 3D LUT,结果应该是一样的。
----------------------------------------------------------------------------------------------------
mpv 为了正确输出 BT.1886 需要知道显示器的对比度,这个本来应该是可以从 ICC profile 中自动检测的,但是很多常见的 ICC profile 是简单的 single curve+matrix 形式,会被 mpv 直接认为是 inf。这时就需要手动设置一下 --icc-force-contrast,比如就把验证校色结果的报告里测量到的对比度填进去。
我在我原来写过的色彩管理教程帖里也一直推荐 single curve+matrix 形式的 profile,因为我发现很多色彩管理系统只能正确处理这种形式。这个就不展开说了。
--vo=gpu-next 目前确实是写死了对比度为 1000:1。在无法从 ICC profile 获取对比度时会默认成 1000:1,也无法通过 --icc-force-contrast 手动指定。这个是 known issue。 |
|