使用 AMD FreeSync™ Premium Pro HDR 颜色空间
与 AMD Freesync™ Premium Pro HDR 相关的四部分教程中的第一部分。本教程涵盖了与颜色相关的术语。
这是关于 AMD FreeSync™ Premium Pro HDR 技术(以下简称 FreeSync HDR)系列文章的第二部分。第一部分 介绍了色彩空间,让您熟悉常用术语以及 FreeSync HDR 所解决的一些问题。第三部分将介绍 色域映射。
在本文中,我们将介绍色调映射的术语,色调映射的 含义,以及影响色调映射器效果的不同显示器功能。之后,我们将进行总结,探讨 FreeSync HDR 如何让您直接对显示器的原生亮度范围进行色调映射,以及在此过程中可能遇到的陷阱。
在深入讨论色调映射之前,我们首先需要定义一些在处理色调映射时常用的术语。
色调映射涉及修改像素的亮度/亮度。像素的亮度是指其发出的光量,光量越多,感知到的亮度就越高。这通常以 尼特 或 SI 单位坎德拉/平方米 (cd/m2) 来衡量。此度量很有用,因为出于我们的目的,所有与亮度相关的内容通常都以尼特来衡量。例如,显示器的最大亮度和人眼的最大感知亮度都常用尼特来衡量,这使我们能够直接比较我们覆盖的可感知范围的多少。
每个显示器发出的每像素光子数量的最大值和最小值都不同。例如,LCD 显示器无法显示完全黑色的像素,因为其背光(很可能)始终处于开启状态。因此,显示器能够显示的亮度值的范围称为显示器的 动态范围。
例如,一个能够以 0.1 尼特到 600 尼特显示色彩的显示器,其动态范围为 599.9 尼特。游戏场景也具有自己的动态范围,由给定帧中最亮和最暗的部分定义。另一种描述动态范围的方法是使用 档 作为单位。每增加一档,亮度就会翻倍,这通常用于描述摄像机的动态范围(3 档比 2 档亮一倍)。
在渲染游戏时,您会发现场景中的大多数对象都处于相似的动态范围内,既不太亮也不太暗。我们将这个平均范围称为游戏中的 中间色调。游戏中的灯光和太阳等对象比此范围更亮,反之,非常暗的对象则更暗。游戏开发者了解其游戏场景的中间色调非常重要,因为当我们谈论色调映射时,这些色调将非常重要。
在如何感知图像与实际情况之间存在许多光学错觉。例如,如果我们想让某物看起来非常明亮,我们可以通过增加其亮度并逐渐将其颜色变为白色来实现。这可以使图像的某些部分看起来比实际更亮,我们将这种效果称为 向白色偏移。
在当前使用基于物理渲染 (PBR) 的游戏中,您可以在材料的镜面高光中看到向白色偏移的现象。镜面高光在 PBR 中不是编码为明亮的白色,而是编码为它们所在的表面的非常亮的颜色版本。
由于我们显示器的动态范围有限,我们无法显示镜面高光的真实亮度,因此我们会根据其亮度将其偏移为白色,使其看起来比实际亮度高得多。当我们开始讨论色调映射时,我们将看到这种效果如何发挥作用。
色调映射 是将更大的源动态范围转换为更小的目标动态范围的过程,同时仍然保留内容亮度整体外观。在游戏的上下文中,我们通常将渲染的帧映射到显示格式的动态范围,例如 sRGB 或 HDR10。
游戏可以模拟亮度范围从几千到一万尼特的内容,但大多数显示器只能显示高达 300-400 尼特的亮度值,因此我们需要以某种方式压缩源动态范围而不扭曲帧的外观。这是通过 色调映射曲线 实现的,这是一条非线性曲线,将源动态范围映射到目标动态范围。

在上面 ACES 色调映射器的图像中,我们展示了典型的色调映射曲线的外观。您会注意到,色调映射器通常会将最暗和最亮的颜色映射到较小的亮度范围,而中间色调则映射到最大的亮度范围。色调映射器通常采用这种基本形式,但映射的亮度范围大小通常由开发者针对其每个游戏进行调整。
例如,如果我们的游戏通常发生在黑暗环境中,我们就不希望将暗色调挤压到很小的亮度范围,就像上面那样,而是会为它们分配更多范围,同时从最亮的区域移除范围。有关如何操纵色调映射曲线的更深入的解释,您可以观看 Timothy Lottes 的 GDC 演讲。
由于 PBR,许多自发光对象比以前亮得多,这使得我们的游戏世界中的光比更加真实,但这意味着我们的色调映射器必须知道如何将其亮度值正确地映射到显示器可显示的亮度值,同时保留场景的整体亮度。
例如,如果我们的显示器的最大亮度为 300 尼特,但我们的游戏有一个发出 500 尼特光芒的车头灯和一个发出 1000 尼特光芒的太阳,我们仍然希望玩家认识到太阳比车头灯更亮。我们可以为曲线的较亮部分增加更多范围,但这样做会使整体游戏看起来更暗,因为中间色调的范围会更小。这个问题可以通过利用向白色偏移、自发光物体对周围场景的影响以及人类视觉系统辨别非常明亮颜色的能力较差来缓解。
由于我们分辨非常明亮物体之间差异的能力较差,因此我们可以为高于游戏平均亮度范围的亮度值分配一个非常小的亮度范围。这将解决我们中间色调缺乏亮度的问题,但会让太阳看起来和车头灯一样亮。
我们可以通过让我们的色调映射器将非常亮的颜色偏移为白色来解决这个问题,使其看起来比实际更亮。太阳也会显得更亮,因为它比车头灯更显着地照亮周围场景,使我们感知它为一个更亮的物体。
我们经常将显示器的动态范围视为其输出亮度的能力,但实际上,它还取决于我们从中观看显示器输出的环境光。例如,如果我们正在明亮的房间中观看显示器,那么最暗的颜色将更亮,因为显示器会反射一些环境光。
净效应是我们的动态范围比预期的要小,从而改变了我们游戏的视觉效果。下面我们展示了在 1000 尼特的环境光下,400 尼特显示器的动态范围如何根据屏幕反射率变化。
如果我们使用相同的显示器,但在 0.05 尼特环境光下,我们会得到以下结果:
这里的关键是,HDR(以及 SDR!)不仅仅取决于显示器的显示能力,还取决于我们观看它的环境。最终结果是,环境光越亮,我们的动态范围就越小,我们最暗的颜色就越亮。
在真实的游戏中,用户会调整游戏内的亮度设置来应对环境光,但我们也可以在色调映射器中利用这些信息。在黑暗的房间里,用户通常会调低亮度以避免眼睛被强光刺痛,但这会降低我们的动态范围。我们可以让较低的亮度设置对应于降低中间色调和暗色的亮度,从而使整体图像变暗,同时允许应用程序充分利用显示器的动态范围。
如果我们身处明亮的房间,我们希望增加亮度会增加暗颜色和中间色调的亮度,并保持其他一切不变,因为在明亮的房间里,我们的显示器具有非常高的最小亮度,我们希望确保我们高于该值。
上述建议允许更智能的亮度控制,让我们能够利用显示器在用户选择观看的任何环境光下的动态范围。您可以在 Timothy Lottes 的 GDC 演讲 中找到更多关于此主题的信息。
当我们说一个 LED 背光显示器显示一张明亮的白色图像时,如果该显示器能够以 600 尼特输出颜色,那么我们期望每个像素都以该亮度显示。问题是,显示器存在物理限制,无法让每个像素都以最大亮度显示。
相反,制造商注意到大多数常规图像中的像素并不特别亮,因此他们制造的显示器在任何时候只能有大约 10% 的像素达到最大亮度。要做到这一点,需要使相邻像素变暗,以便将更多电力用于使其他像素更亮。这被称为 局部调光。
局部调光的实现很大程度上取决于显示器是边缘发光还是全阵列背光。边缘发光显示器只有屏幕侧面的 LED,允许显示器选择性地调亮或调暗图像的粗略水平和垂直条带。全阵列显示器在屏幕后面有一个 LED 网格(通常比像素少得多),允许显示器选择性地调暗和调亮图像的粗略四边形。
对于两种背光类型,当一个 LED 非常亮时,其他 LED 需要变暗,因为显示器具有固定的功率预算。这是通过色调映射过程实现的,该过程由显示器应用,用于确定图像的哪些部分应该变暗,哪些部分可以保持明亮。通过这样做,显示器制造商有时可以将最大亮度翻倍——这是他们营销数字中的一个关键指标——但这仅限于区域内少数像素被设置为高亮度值时。
这项技术会带来一个称为 光晕 (有时称为 辉光)的伪影。如果您在显示器上显示的图像是夜空中的月亮,那么整个场景应该很暗,除了月亮应该保持明亮。在边缘发光显示器中,局部调光可能会导致月亮所在的水平和垂直条带变亮,从而使这些条带中的暗对象比应有的更亮。
对于全阵列显示器,只有月亮所在的网格单元会变亮,但月亮通常比该网格单元小,这使得它周围的暗像素比预期的要亮。您可以在下面的图像中看到这些伪影的示例,其中第一张图像禁用了局部调光,而第二张图像启用了局部调光,我们可以看到鼠标所在位置有一条水平光带。


由于局部调光会在消费者显示器上呈现图像伪影,尤其是在具有明亮对象的黑暗场景(如夜空)中,因此局部调光可能是一个不受欢迎的效果,但它也能提供更高的亮度值和对比度,从而获得更好的图像。局部调光的好坏很大程度上取决于正在显示的內容,因此我们将研究 FreeSync HDR 为开发者提供了哪些功能来操纵此显示器功能。您可以在 此处 找到更多关于局部调光的信息。
FreeSync HDR 使开发者能够了解显示器的真实动态范围,从而使游戏能够更好地根据显示器的功能进行自身色调映射。在 FreeSync HDR 中,您可以查询显示器可以显示的最小和最大亮度值(启用和禁用局部调光)。然后可以将这些值输入到游戏的色调映射器中,以便它了解确切的动态范围。如果开发人员认为局部调光的伪影不值得,他们也可以选择使用 FreeSync HDR 禁用局部调光。这是一个开发人员必须通过测试其游戏启用或禁用局部调光后的效果来做出的选择,因此我们无法提供一套硬性规则供您遵循。
将 FreeSync HDR 添加到支持 HDR10 的游戏中时,重要的是要记住,目前没有任何显示器可以显示 HDR10 的完整动态范围。因此,当您尝试将用于 HDR10 的色调映射器应用于 FreeSync HDR 时,您希望将更多的输出范围分配给中间色调,因为它们是场景中最常见的元素。天真地缩放色调映射曲线可能会减少您帧中的中间色调数量,因此您需要进行试验,以找出哪种色调映射曲线能为您的 FreeSync HDR 内容提供最佳输出。
为 FreeSync HDR 创建色调映射器时可能遇到的另一个问题是显示器的最大亮度。如果您启用了局部调光,那么您期望最大亮度会高得多。这是真的,但仅限于一次场景的一小部分,因为显示器无法在整个图像上提供最大亮度。
当场景太亮而无法以最大亮度显示时,显示器会通过色调映射提供的帧,使其以局部调光禁用时的亮度显示,这可能会低 100 或 200 尼特。在这种情况下,游戏的色调映射器不会知道进行调整,并且会继续按照比实际亮度范围更亮的显示器亮度范围进行色调映射,从而导致场景比预期更暗。这些效果通常发生在明亮的白天场景中,因此局部调光的优势主要出现在场景的平均光照水平变暗时,例如在黄昏或夜晚,或者在室内。
如果您的游戏大部分是明亮场景,那么色调映射器应该假定局部调光的全部好处将不会发生,并且一旦我们接近显示器在禁用局部调光时的最大亮度时,它应该开始限制输出亮度范围。
FreeSync HDR 让您了解并能够访问显示器的完整动态范围,并控制物理亮度,使您能够利用它并为用户提供出色的图像质量。我们已经介绍了局部调光等动态范围功能的工作原理,以及为什么对 HDR10 进行天真的色调映射器移植可能会导致图像过暗。
在下一篇文章中,我们将介绍色域映射是什么以及它在 FreeSync HDR 中的工作原理!