色彩让一切更美好。如果是 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 支持),但是您可以通过设置
GDK_DEBUG=hdr
环境变量。
来尝试 GTK 在该色彩状态下渲染时的效果。请注意,这不会使 HDR 内容显示在您的屏幕上——我们在 HDR 中进行渲染,并将最终帧作为最后一步转换回 sRGB。要使 HDR 内容显示在屏幕上,需要一个接受此类内容的合成器。
未来:更多色彩状态和线性合成
我们仍然有一个很长的待办事项列表,需要在 GTK 中完全开发色彩支持。
重点包括
- 更多色彩状态(包括用于更好渐变的 OKLCH 和用于视频内容的 YUV)
- 色彩状态感知渲染 API(GdkColor 和新的 GtkSnapshot API)
- 将 CSS 色彩状态信息传递给渲染器
- 从 gstreamer 传播色彩状态信息(用于 HDR 等)
- 切换到线性合成
其中一些有望及时赶上 GTK 4.16 发布。
总结
更好的色彩支持即将到来 GTK。