色彩让一切更美好。如果是 HDR,那就更好了。

在这篇文章中,我们将概述 GTK 中色彩方面的进展,而不会深入探讨色彩学和色彩科学的细节。
这项工作的高级目标是实现对 HDR 内容和色彩管理工作流程的正确处理。
最初,是 sRGB
直到现在,GTK 中的颜色始终被假定为 sRGB 色彩空间。无处不在的 GdkRGBA 结构体被定义为指定一个 sRGB 颜色。
sRGB 在 20 年前是很棒的东西,但世界正在转向其他色彩空间,这些色彩空间包含更广泛的色调(例如 Display-P3)或更大的动态范围(例如 BT.2100-PQ)。
在我们的议程上讨论了一段时间后(对这个主题的初步调查发生在 2021 年),我们终于开始着手为更加多彩的未来奠定基础。
即将推出:GdkColorState
今年早些时候,我们合并了 Alice 的一些出色工作,以支持 CSS 引擎中的现代颜色语法和色彩空间。在 CSS 中使用富有表现力的颜色很棒,但如果我们的所有渲染机制仍然需要以 sRGB 指定颜色,那就无法真正发挥作用。
因此,在过去的一两个月里,我们增加了对在定义明确的色彩空间中进行渲染的支持,并引入了一个表示这些色彩空间的对象。它被称为 GdkColorState(不要问我为什么名称从空间改为状态)。
截至目前,GdkColorState 可以表示 sRGB 和 BT.2100-PQ,以及它们的线性化变体。你还不能用这些对象做太多事情,它们主要由我们的渲染器在内部使用。
不过,你可以做的一件事是尝试一下在线性色彩空间中渲染的效果,方法是设置
GDK_DEBUG=linear
环境变量。
我们最终需要进行这种更改,以便产生正确且易于理解的结果,尤其是在处理 HDR 内容时。
在线性色彩状态下进行所有合成看起来确实略有不同,因此我们希望推迟此更改,直到所有周围的工作都完成,并在开发周期的开始时进行,以便让每个人都有时间进行调整。
新协议
Wayland 色彩管理协议的制定已经很长时间了,但它有望接近离开实验阶段——kwin 已经支持它,并且还有一个 mutter 分支。
我们添加了对 xx-color-management-v4 协议的支持,因此我们可以从合成器获取首选的色彩状态(如果它支持该协议),并且我们可以告诉它我们生成的帧的色彩状态。
你的合成器今天不太可能首选像 BT.2100-PQ 这样的 HDR 色彩状态(除非你找到隐藏的开关来开启实验性 HDR 支持),但你可以尝试一下当 GTK 在该色彩状态下渲染时的效果,方法是设置
GDK_DEBUG=hdr
环境变量。
请注意,这不会使 HDR 内容显示在你的屏幕上——我们在 HDR 中进行渲染,并将最终帧作为最后一步转换回 sRGB。要在屏幕上显示 HDR 内容,需要一个接受此类内容的合成器。
未来:更多色彩状态和线性合成
我们仍然有一个很长的待办事项列表,以便在 GTK 中全面开发色彩支持。
重点包括
- 更多色彩状态(包括用于更好渐变的 OKLCH 和用于视频内容的 YUV)
- 色彩状态感知渲染 API (GdkColor 和新的 GtkSnapshot API)
- 将 CSS 色彩状态信息传递给渲染器
- 从 gstreamer 传播色彩状态信息(用于 HDR 等)
- 切换到线性合成
其中一些有望及时在 GTK 4.16 版本中发布。
总结
更好的色彩支持即将推出到 GTK。