使用 AMD FreeSync™ Premium Pro HDR 颜色空间

首次发布时间:
Ihor Szlachtycz's avatar
Ihor Szlachtycz

这是关于 AMD FreeSync™ Premium Pro HDR 技术(以下简称 FreeSync HDR)的四篇系列教程中的第一篇。 

我们将从术语开始,探讨 FreeSync HDR 解决的问题,然后在后续文章中讨论 色调映射(第二部分)、 色域映射(第三部分),以及 如何将这一切整合在一起(第四部分),并提供代码示例。

色彩理论

本节将简要介绍本系列博客文章中将要使用的一些术语。这绝不是一个关于色彩理论或色彩处理的完整教程,但它应该足以帮助您理解系列的其余部分。有关色彩理论的更详细介绍,请参阅 此处 和 此处 的链接。

色彩理论的基本概念,也是我们在显示帧时将要处理的一个概念是色彩空间。 色彩空间可以被视为一个 n 维空间,颜色可以在其中被唯一地表示为一个 n 维点。不同的色彩空间可以更容易地修改某些色彩属性。例如,一个色彩空间可以轻松地混合出看起来自然的颜色,而另一个色彩空间则可以只改变颜色的亮度而不影响其他属性。

游戏中常用的一类色彩空间是 RGB,它们是三维色彩空间,每种颜色都由红、绿、蓝三个值表示。在游戏中,我们通常使用 Rec709 和 Rec2020 RGB 色彩空间,两者之间的区别在于当主色值为 1 时,其强度会有所不同。例如,如果我在 Rec709 中有一个颜色值为红=1,蓝=0,绿=0,那么它将比在 Rec2020 中具有相同编码的颜色“红色”要弱,因为在红=1 时,Rec2020 代表的红色更强烈。当我们将讨论色域时,这一点将变得更加重要。游戏通常在 RGB 色彩空间中工作,因为它允许自然地混合颜色,从而可以轻松生成各种色彩效果,例如在表面上累积光。

一些色彩空间的设计使得当我们选择一个颜色时,在一定半径内的邻近颜色被感知为相同或相似。如果一个色彩空间具有此属性,我们称之为 感知均匀。我们将使用的一个具有此属性的色彩空间是 CIELAB。在 CIELAB 中,颜色由 L 、 a 和 b 值编码,其中 L 描述颜色的亮度/亮度,而 a 和 b 描述颜色的 色度。您可以将色度视为真实的“颜色”,而亮度仅仅是颜色的亮度。这个色彩空间的感知均匀属性将在第三部分讨论色域映射算法时使用。

在色彩理论家使用的色彩数据可视化中,通常需要可视化不包含亮度的色彩数据。这可以在 CIELAB 中完成,但结果通常非常不规则,因此通常使用一个名为 Yxy 的色彩空间。在此空间中,颜色由 Y 、 x 和 y 值编码,其中 Y 代表亮度,而 x 、 y 代表色度(x 、 y 与 CIELAB 中的 a 、 b 不同)。此色彩空间通常不在游戏中广泛使用,因为有更高效的色彩空间可以轻松修改亮度,但此空间在可视化方面用途广泛,正如我们将要在讨论色域时看到的。您可以在 此处 了解有关 Yxy 色彩空间的更多信息。

在处理不同的色彩空间时,我们需要一种方法将一种色彩空间中的颜色转换为另一种。当我们定义更多的色彩空间时,我们会遇到一个问题,因为现在每个新的空间都需要定义它与所有其他空间之间的转换方式。色彩理论家提出的解决方案是定义一个标准的色彩空间,称为 XYZ,所有其他色彩空间都定义了到它的映射。这意味着,如果我们想将颜色从色彩空间 A 转换为色彩空间 B,我们可以从 A 转换为 XYZ,然后再从 XYZ 转换为 B。在 XYZ 中,颜色由 X 、 Y 和 Z 值表示,其中 Y 代表亮度,但 X 和 Z 值代表色度,并且也部分编码了亮度(它们不像 CIELAB 和 Yxy 那样是分开的)。您可以在 此处 阅读更多关于 XYZ 色彩空间的信息。

先前我们提到 RGB 是一类色彩空间,每种空间在主色值为 1 时都有不同的红/绿/蓝强度。如果我们限制 RGB 中的色彩空间,使得每个颜色通道的值在 0 到 1 之间,那么我们就得到一个 RGB 立方体,我们称之为该 RGB 色彩空间的 色域体积。由于 Rec2020 在主色值为 1 时比 Rec709 具有更强的红/绿/蓝值,因此 Rec2020 的色域体积包含了 Rec709 的色域体积。

因此,我们可以将一个 RGB 空间的色域体积转换为另一个色彩空间,并比较不同色域体积在不同色彩空间中的外观。这一点很有用,因为不同的色彩空间可能具有一些我们希望更容易比较的理想属性,例如,色域体积允许的亮度范围。如前所述,色彩理论家在 Yxy 中表示色彩数据。 

原因是,在 Yxy 中,我们可以将色域体积投影到色度平面(x,y 平面)上,以查看色域体积表示的“颜色”范围,以及颜色的亮度(投影的色域体积简称为 色域)。您可以在下面的图像中看到 Yxy 中的色域体积及其展平后的转换。


像 Rec709 和 Rec2020 这样的不同 RGB 色彩空间在 Yxy 中具有三角形色域,我们经常在这个空间中可视化它们,以比较一个色域与另一个色域相比表示了多少更多的颜色。在 Yxy 中可视化色彩色域的另一个好处是,色彩理论家已经计算出了所有人类可感知颜色的色域。这样,我们就可以比较任何色域覆盖了所有可感知颜色中的多大一部分,并避免覆盖超出可感知范围的颜色。 在下面的图像中,我们提供了人眼色域和不同 RGB 色彩空间色域的可视化。

带有颜色的马蹄形代表人类眼睛可感知的所有颜色(您可以 此处 和 此处 了解此形状的推导过程)。不同的色彩色域由重叠人眼可感知色域的不同三角形标记。您可以看到,许多可感知的颜色并未被这些标准色彩空间覆盖!

根据 4 个 色度点 构建颜色色域的最后一个重要概念。色度点是 Yxy 色彩空间(与上述色域图相同的空间)的 x,y 平面上的点。我们可以通过提供色域三角形的 3 个顶点(红色、绿色、蓝色顶点)以及一个白点来定义颜色色域。

在上图中,您可以看到白点称为 D65 ,但也有其他白点可供选择。对于本博客系列,了解白点的工作细节并不重要,但我们将使用色度点来构建色域映射的博客文章中的颜色色域。

根据这些色度点构建颜色色域之所以有用,是因为它允许我们相对于人眼的可感知色域来定义色域,从而让我们更清楚地了解哪些可感知的颜色被覆盖了。您可以在 此处 找到给定色度和白点将 RGB 转换为 XYZ 矩阵所需的数学。

颜色编码与伽马

在游戏中,我们希望找到有效编码颜色以限制带宽和 ALU 操作的方法,同时保留我们要显示的颜色的精度。标准动态范围(SDR)显示器的当前标准是在 RGB 色彩空间中为每个颜色通道编码 8 位,从而总共有 24 位 RGB。 naively,我们可以为亮色和暗色分配相同数量的位,但人眼对暗色和亮色的变化更敏感,因此我们会过度表示我们几乎无法区分的颜色,而表示不足我们更敏感的颜色。

而且,每种颜色通道只有 8 位来表示任何给定的颜色,这个问题会非常明显,因此我们需要一种重新映射,为暗颜色分配更多的可用精度。这种重新映射称为 伽马曲线(有时也称为传递函数),它是一个非线性曲线,试图将感知差异更大的颜色映射到更宽的位范围,从而解决了大多数颜色编码问题。

通常,伽马曲线只考虑人眼对光的敏感度,因此我们会为不同的色域体积得到不同的伽马曲线。这是因为不同的色域体积具有不同的亮度范围。例如,大多数 Rec709 显示器都有一个伽马曲线,游戏通常使用下面图像中显示的 gamma 2.2 曲线来近似。

此曲线将 0 到 1 之间的原始颜色通道值作为输入,然后将其映射到 0 到 1 之间的新颜色通道值,但其中较暗的颜色被映射到更大的范围,因此较亮的颜色被映射到较小的范围。

在 HDR 中,标准颜色格式每通道使用 10 到 12 位,这使我们能够编码更多的颜色。我们的 HDR 色域体积也大得多,因此我们仍然面临同样的问题,并且需要小心考虑如何映射感知相似的颜色与不相似的颜色。例如,在 HDR10 标准 中,我们不使用 gamma 2.2 曲线,而是使用 PQ 曲线,您可以在下面的图像中看到。


PQ 曲线可以像伽马曲线一样按颜色通道应用,但也可以仅应用于颜色的亮度。如果我们选择仅将 PQ 曲线应用于亮度,则必须将颜色编码在 Yxy 之类的空间中,其中一个值代表亮度,其他值代表色度。

您会注意到 PQ 曲线比 gamma 2.2 曲线平坦得多。这是因为我们期望颜色值具有比以前远得多的亮度范围。PQ 曲线工作原理和开发细节对于这组博客文章并不重要,但如果您想了解更多关于伽马曲线、传递函数和 PQ 的信息,可以在 此处 和 此处 找到更多信息。

显示问题和 FreeSync HDR 解决方案

FreeSync HDR 是 AMD 部分开发的开放标准,旨在为游戏开发者提供低延迟 HDR 显示,并允许游戏利用其完整的可显示色彩和亮度范围。当前显示器中存在的主要延迟问题是,游戏会对帧进行色调和色域映射,以便在标准的 HDR 色彩空间中渲染,然后显示器也会对这些帧进行色调和色域映射以适应其原生色彩空间,导致工作量加倍,延迟更长,如下图所示。

FreeSync HDR 通过让游戏直接将色调和色域映射到显示器的原生色彩空间来消除这种延迟,从而使显示器只需显示图像而无需修改,从而降低延迟。

当前显示器的另一个问题是,普通显示器倾向于在游戏帧显示之前对其应用滤镜和后期处理,而这些后期处理不受开发者控制,也无法由开发者禁用。这些滤镜通常会过度提亮或过度饱和帧,导致游戏在不同显示器上的渲染效果不同。

通过使用 FreeSync HDR 的显示模式可以解决此问题,这些模式可确保游戏提供的帧按原样显示,没有任何后期处理修改。显示器还必须通过 AMD 认证流程,该流程验证颜色是否准确显示,从而在不同的 FreeSync HDR 显示器上实现更一致的游戏显示。

与原始 FreeSync 标准一样,当应用程序处于全屏独占模式时,可变刷新率会自动启用,但如果我们想同时启用 FreeSync HDR,那么在游戏初始化期间,游戏需要设置它想要使用的显示模式,并且它需要查询显示器的色彩色域/亮度范围,以便它可以正确地将其帧映射到显示器的原生范围。我们将在接下来的博客文章中讨论游戏如何进行 FreeSync HDR 的色调和色域映射,以及其中存在的挑战。

FreeSync HDR 显示模式

FreeSync HDR 提供了两种新的显示模式,称为 FreeSync2_scRGB 和 FreeSync2_Gamma22 ,它们提供了上述优点,同时提供了将 FreeSync HDR 集成到现有游戏引擎的不同方法。下面我们将介绍每种显示模式提供的功能、何时使用以及如何将其集成到渲染器中。

FreeSync2_scRGB

此显示模式旨在帮助那些拥有 Rec709 流水线并且希望在不大幅更改颜色流水线的情况下渲染 HDR 的开发人员。此模式的帧缓冲区的颜色应编码为 Rec709,但在显示时,如果颜色超出了 Rec709 RGB 立方体但位于显示器原生色彩空间内,则颜色将正确显示(否则将钳位到显示器原生色彩空间)。

帧缓冲区应存储在 R16G16B16A16 浮点格式中,颜色不应用伽马曲线,并且每个颜色的通道需要乘以显示器的动态范围然后除以 80。

FreeSync2_Gamma22

此显示模式旨在为拥有更复杂 HDR 色彩流水线的开发人员提供与 FreeSync HDR 的轻松集成。此模式的帧缓冲区颜色应编码为应用程序查询的显示器原生色域,如果颜色超出 0-1 范围,则会将其钳位到范围内。帧缓冲区应存储在 R10G10B10A2 unorm 格式中,并带有 gamma 2.2 曲线。

结论

FreeSync HDR 的目标是为开发人员提供低延迟 HDR 显示,具有可变刷新率,以及以更一致和准确的方式显示游戏的强大功能。AMD 采用的方法是提供 FreeSync HDR 显示模式,其中显示器会原样显示游戏,而开发人员则会获得有关显示器可以显示和无法显示的信息,从而允许开发人员修改其帧以适应显示器的能力。

在下一篇文章中,我们将讨论 FreeSync HDR 如何影响色调映射,以及如何修改当前的色调映射器以利用 FreeSync HDR 显示器的真实亮度范围。

参考文献

色彩测量入门指南 – medium.com

CIE LAB、CIE RGB、CIE xyY 和 CIE XYZ 之间的区别 – wolfcrow.com

图形工程师基础色彩科学 – wordpress.com

阅读更多

Ihor Szlachtycz's avatar

Ihor Szlachtycz

指向第三方网站的链接仅为方便起见提供,除非明确说明,否则 AMD 对这些链接网站的内容概不负责,也不表示认可。

相关新闻和技术文章

相关视频

© . This site is unofficial and not affiliated with AMD.