色彩让一切更美好。如果它是 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。