第1章 Color Management
引言
在讨论电影摄影之前,我们无法回避色彩管理的问题。了解你在哪个色彩空间内工作以及你的显示目标是什么至关重要。
是的,色彩管理可能令人望而生畏,但它将为你后续构建正确的灯光打下坚实的基础。计算机图形学中的灯光与技术的联系如此紧密,以至于深入理解这些概念非常重要。
市面上有一些不错的入门课程,例如 Cinematic Color,但我发现在第 9 页就迷失在数学公式中有点令人沮丧。因此,我尽力让本章节尽可能简单易懂,对艺术家友好。
首要且最重要的决定
根据我的经验,色彩管理工作流 (CMW) 的选择是启动项目时需要做出的第一个决定。因为,每一个艺术决策都将基于这个选择:
- 反照率值
- 灯光的曝光
- 外观开发(纹理和表面处理)
下面的预告片就是一个例子,数百名艺术家数千小时的辛勤工作因错误的色彩管理而“付诸东流”。看看熔岩,它被截断了!
什么是颜色?
我的一些数据来自 Thomas Mansencal 的这篇文章。由于它有点技术性,我尝试为不熟悉这个主题的读者简化它。让我们从 Mark D. Fairchild 的这句精彩引言开始:
“为什么在色彩外观领域达成一致的术语会特别困难?也许答案就在于这个主题的本质。几乎每个人都知道颜色是什么。毕竟,他们从出生后不久就有了第一手的体验。然而,很少有人能精确描述他们的色彩体验,甚至精确地定义颜色。“
初步观察
人类视觉系统 (HVS)
当我们谈论颜色时,需要考虑三件事:
- 眼睛
- 大脑
- 物体
以下是一些例子,它们将向你展示我们的大脑很容易被欺骗,我们应该以谦逊的态度谈论颜色。

010_colorManagement_010_optical_illusions_FHD
首先要知道的是,人类视觉系统是一种极其复杂的“技术”。 没有人真正知道它是如何工作的,但我可以告诉你:
- 颜色是一种感觉。
- 颜色只存在于大脑中。
大脑在我们的视觉系统中扮演着非常重要的角色,因为它负责管理眼睛接收到的所有数据。例如,当“图像”投射到视网膜上时,它实际上是倒立的。大脑会将其纠正过来:
我们真正看到的是我们的大脑根据眼睛提供的输入对物体进行的重建,而不是我们的眼睛接收到的实际光线。
摘自这篇文章。
我认为与 Guerilla Render 的创建者 Benjamin Legros 讨论人眼会很有趣,他实际上向我解释道:“我们的眼睛实际上只能看到‘红、绿和蓝’。 它们很糟糕!与螳螂虾相比简直不值一提。“
(第 2/9 段)

010_colorManagement_130_mantis_shrimp_FHD
这是一双相当惊人的眼睛:它们拥有十二种光感受器,而人类只有三种!它甚至能看到紫外线和红外线,就像 Predator 一样!
什么是光?
要定义颜色,你必须先定义光,因为没有光,任何颜色都无法被感知。
- 光 是一种能量。
- 光能以波的形式传播。
有些光以短而“急促”的波传播。另一些光则以长而平缓的波传播。蓝光波比红光波短。
引自 Cinematic Color:色彩科学的研究始于光谱。人们将光能作为波长的函数进行测量。[…] 位于此范围中间(黄绿色)的光被认为是最明亮的。

010_colorManagement_160_visible_wave_FHD
光是一种人眼可见的电磁辐射。可见光通常被定义为波长在 400-700 纳米之间,介于红外线(波长较长)和紫外线(波长较短)之间。这些波由 光子 组成。
所有光都沿直线传播,除非遇到障碍物并发生以下情况之一:
- 反射(像镜子一样)。
- 折射(像棱镜一样弯曲)。
- 散射(像大气中的气体分子一样)。
我们还可以将 衍射 加入此列表,尽管它实际上是上述现象的一部分。
光是所有颜色的来源。 光在我们生活中的重要性实际上令人惊叹。柠檬之所以看起来是黄色的,是因为它的表面反射了黄色光,而不是因为它本身真的是黄色的。 这在过去让我非常困惑,但 颜料 之所以呈现颜色,是因为它们选择性地反射和吸收特定波长的可见光。
这些概念大多来自 Wikipedia,你可以在网上找到大量关于此主题的 文章。
从光到颜色
那么,我们如何从光谱到颜色呢?我无法比 Jeremy Selan 更清晰地解释颜色匹配函数,所以我直接引用他的话:
人类视觉系统 […] 是三色视觉的。因此,颜色可以完全由三个变量的函数来指定。通过一系列感知实验,色彩学界推导出了三条曲线,即 CIE1931 颜色匹配函数,它们允许将光谱能量转换为颜色的度量。
引自精彩的 Cinematic Color。

010_colorManagement_170_color_matching_functions_FHD
CIE 1931 颜色匹配函数将光谱能量分布转换为颜色的度量,即 XYZ。[…] 当你用 CIE 1931 曲线对光谱功率分布进行积分时,输出被称为 CIE XYZ 三刺激值。
这里我不会提及 同色异谱。请自行查阅。
(第 3/9 段)
我花了一些时间才把这些点串联起来,如果没有 hg2dc.com 上这张精彩的图表,我想我可能无法理解这一点:

010_colorManagement_175_diagramme_recap_FHD
当我们将所有可能的光谱转换到 x, y, Y 空间并绘制 x, y 坐标时,它们会落在色度图上一个马蹄形区域内。
1931 年和 1976 年的 CIE 色度图
“CIE XYZ” 是由国际照明委员会 (CIE) 于 1931 年定义的色度图。这是基于人类视觉描述颜色的第一步。
45 年后,为了改进它,创建了一个更新版本:“CIE U’V’” 诞生了。尽管 1976 年的 CIE U’V’ 是一个更“感知均匀”的变体,但 1931 年的版本在色彩界仍然是最常用的。积习难改。

010_colorManagement_180_diagramme_CIE_FHD
1931 年和 1976 年的两个主要 CIE 色度图。
David L. MacAdam (1942) 的研究表明,CIE 1931 xy 色度图不具备感知均匀性。这意味着,在 CIE 1931 xy 色度图内部,颜色的可测量色度与观察误差容限之间的关系并不一致。
引自这篇文章。
关于色度图,有两个重要的概念:
- 这些色度图是人类眼睛可感知的所有色度的可视化表示。
- 有 2 个轴可用于为此图中的每个色度分配一个唯一的坐标。
引自 Cinematic Color:马蹄形区域内部代表所有可能的综合颜色光谱;区域外部则不对应物理上可能的颜色。
我们将其描述为马蹄形或舌形区域。它也可能是一个帆板帆……
CIE XYZ 作为一个标准参考,许多其他色彩空间都是基于它定义的。请记住这些图表,因为我们后面会经常提到它们。
色度还是颜色?
此时,你可能会问自己:“色度”和“颜色”有什么区别?这是一个恰当的问题。基本上,每当我们提到“颜色”或“色调”这些术语时,我们就进入了“感知”领域。这意味着只有当颜色被人类(或我们所谓的“标准观察者”)感知到时,它才存在。
另一方面,色度是一种刺激。它不包含任何人观察它并感知到某种东西的概念。是的,你可能已经猜到了,相同的刺激有时会产生四种不同的感知颜色。这在 Siggraph 2018 的这个课程 中得到了非常清晰的演示。
RGB 色彩空间及其组成部分
一个 RGB 色彩空间由我们工作空间中所有可用的颜色组成。它由三个组成部分定义:
这就是一个 RGB 色彩空间的样子:

010_colorManagement_190_rgb_colorspace_HD
此 GIF 来自上文提到的 Colour Science 的这篇文章。
在上图中,有三点需要注意:
- RGB 色彩空间实际上存在于三维空间中(屏幕左侧)。
- 为了便于可视化,我们通常只使用二维切片,例如“俯视图”(屏幕右下角)。在此示例中,您可以看到相对于 CIE 1931 色度图的 Rec. 709 色彩空间。
- 注意到那些黑点了吗?它们代表了图像(屏幕右上角)在 RGB 色彩空间(本例中为 Rec. 709)内的像素值。这被称为绘制色域。
(第 4/9 段)
三原色
“三原色的色度坐标定义了一个给定 RGB 色彩空间所能编码的色域(颜色三角形)。”
换句话说,三原色就是三角形的顶点。 接下来我们要把事情稍微复杂化一点……请注意!每个顶点在其自身的色彩空间中都有一个纯 RGB 值:
- 红色 = 1, 0, 0
- 绿色 = 0, 1, 0
- 蓝色 = 0, 0, 1
但是,每个顶点在 CIE 色度图上都有一个唯一的 xy 坐标。这就是我们能够比较它们的方式。以一种通用的方式定义一种颜色(独立于其亮度)的唯一方法,就是给出它的 xy 坐标。
在这张图表中,你可以看到不同色彩空间的坐标:

010_colorManagement_200_primaries_FHD
这些就像是最常见的 RGB 色彩空间。
例如,地球上没有比 BT.2020 三原色或激光更饱和的颜色了,它们都位于“光谱轨迹”(色度图的边界)上。一个色度越接近光谱轨迹,它在我们看来就会显得越鲜艳。
三原色比较
你现在应该清楚地看到,每个色彩空间的不同三原色(如下图所示):
- 具有不同的 xy 坐标。
- 具有相同的“纯” RGB 值。
- 是不同的刺激源。

010_colorManagement_210_monitor_colorspace_FHD
我使用了两种色度图(1931 年和 1976 年)进行比较。
白点
白点定义了给定 RGB 色彩空间的白色。任何位于穿过该白点的中性轴上的颜色集合,无论其亮度如何,对于该 RGB 色彩空间来说都是中性的。

010_colorManagement_220_CIE_Illuminants_D_Series_FHD
中性轴也称为消色差轴。
有不同类型的白点。例如,“sRGB”和“Rec.2020”色彩空间的白点是 D65。这是它们内在特性的一部分。但根据其使用场景,它也可以是一个创作选择。因此存在“创作白点”的概念(就像白平衡一样):
- 如果你想模拟标准观片灯箱的光质,选择 D50。选择像 D50 这样的暖色温将创造出暖色调的白色。
- 如果你更喜欢正午日光的质感,选择 D65。像 D65 这样更高的色温设置将创造出稍冷一点的白色。
- 如果你甚至更喜欢更冷的日光,选择 D75。
传递函数(OETF 和 EOTF)
传递函数执行线性光分量(三刺激值)与非线性 R’G’B’ 视频信号之间的映射(大多数时候是为了编码优化和带宽性能)。
Substance PBR 指南实际上提供了更多背景信息:
人类视觉系统(HVS)对较暗色调的相对差异更敏感,而不是较亮的色调。正因为如此,不使用‘伽马校正’是浪费的,因为太多的比特将被分配到 HVS 无法区分色调的区域。
传递函数(或“伽马”)有助于更好地编码比特(从而提高性能)。有两种传递函数:
- OETF:光电转换函数,将线性场景光转换为视频信号,通常在相机内部进行。当你拍摄或扫描时(用于编码)。
- EOTF:电光转换函数,将视频信号转换为显示器的线性光输出。当你向屏幕发送信号时(用于解码)。

010_colorManagement_230_transfer_functions_FHD
(第 5/9 段)
此外还有对数传递函数,但我们在此不讨论它们。
常见错误
行业内存在一些常见错误(即使是资深 VFX 总监也会犯):
- “线性”不是一个色彩空间。
- “线性”不一定是广色域,当然也不是无限的。
- 它是一种 100% 依赖于色域的传递函数。
99% 的情况下,当人们提到“线性”时,他们实际指的是:“采用 D65 白点和线性传递函数的 BT.709 原色”。但由于我们过去大约 20 年一直使用“线性”这个术语,很难让他们过渡到更准确的术语。
同样有趣的是,例如 ACEScg 也是“线性”的。或者更准确地说:“采用 ACES 白点(约 D60)和线性传递函数的 AP1 原色”。这是无法回避的:一个色彩空间包含三个组成部分。
为简单起见,此处不讨论色彩空间的其他“属性”,例如“观看环境”或“图像状态”。
行业标准
屏幕制造商和电影巨头们已经就一些标准达成一致。它们的特性改变了我们图像的显示方式。以下是对我们最重要的五个标准:
- sRGB 用于互联网、Windows 和相机照片。
- Rec. 709 具有与 sRGB 相同的原色,但在传递函数/伽马值上有所不同(这是因为 Rec.709 的目标用途是视频,预期在昏暗环境中观看)。
- DCI-P3 用于数字电影放映,由 DCI 组织定义,并由 SMPTE 发布。
- Rec. 2020,也称为 UHD TV,是色度学的未来。
- AdobeRGB 用于印刷项目。

010_colorManagement_240_monitor_colorspace_FHD
在 BT.709 显示器上显示的 BT.709 绿色原色,不会看起来像在 BT.2020 显示器上显示的 BT.2020 绿色原色。它们是完全不同的色度!
我们如何在 CG 中使用这些色彩空间?主要有两个用途:
- 渲染空间:也称为工作空间,用于我们的光照计算(场景参考状态)。
- 显示空间:应通过适当的校准与我们的显示器匹配(显示参考状态)。
渲染空间与显示空间
渲染空间和显示空间不必相同。 理解这两者之间的区别非常重要。在 CG 中,渲染空间总是具有线性传递函数。
基本上,显示空间应该与您公司使用的显示器匹配。此外,当您处理一个项目时,您必须知道您的显示目标是什么。我们的图像将在智能手机、电视机还是影院中被观看?
这正是色彩管理真正派上用场的地方。在 CG 工作流程中,了解每个步骤中您正在使用的色彩空间至关重要。
购买显示器时,您应该检查其对色彩空间的覆盖率。使用与您的显示器规格或项目需求不完全匹配的显示空间是毫无意义的。
如果预算允许,我建议选择覆盖率达到 100% 的显示器。
什么是 sRGB?
由于许多历史原因,对于 sRGB 的确切定义尚未达成一致。但我不想引发另一场伽马/sRGB EOTF “战争”,所以我不会在此话题上分享我的观点。
但基本上,我们仍然不确定显示器的 EOTF 应该是“sRGB 分段函数”还是纯粹的“幂函数”(人们误称为“伽马”)。两者在现实世界中都存在。如果您想了解更多关于这个话题的信息,我建议观看 Daniele Siragusano 的视频。
因此不幸的是,sRGB 对许多艺术家来说仍然是一个令人困惑的概念:
- 有人说:“它是一个色彩空间!”
- 其他人反驳:“它是一种传递函数!”
sRGB 实际上两者都是!正如 Substance PBR 指南中所解释的:
“区分 sRGB OETF 和 sRGB 色彩空间至关重要;OETF 只是构成 RGB 色彩空间的三个组成部分之一。”
场景线性工作流
对我来说,这是学生作品与专业作品之间最大的区别。场景线性工作流在行业内是强制性的。我不知道有任何受人尊敬的、不使用它的工作室。
Jeremy Selan:即使在完全 CG 的背景下,延续传统电影工作流程中那些有益的部分通常是可取的。因此,我们主张将动画长片视为在计算机内创建一个“虚拟电影片场”,包括虚拟摄像机、虚拟负片和虚拟正片。

010_colorManagement_250_linear_workflow_FHD
在这个例子中,输入是显示参考的,并经过线性化处理以进行光照计算。然后,我们获取场景参考的输出,并使用色调映射来正确查看它。
如前所述,显示器具有伽马校正功能以正确显示图像。 自 CRT 显示器以来,这已成为视觉舒适度的行业标准(因为光强度不随电压线性变化)。
(第 6/9 段)
我们通过将反向的 EOTF 保存到我们的显示参考图像中来纠正这个问题。这就是为什么你需要对它们进行线性化处理才能用于渲染。这一点非常重要:如果你不为渲染空间使用线性传递函数,你的渲染结果永远不会正确。直接使用纯 sRGB 进行渲染(和显示)是完全错误的!
显示 EOTF:是“向上”还是“向下”?
那么,当我们说我们的显示器具有 2.2 的伽马值,并且我们以“sRGB”格式保存显示参考图像时,这是否意味着我们添加了两次相同的伽马校正?嗯,实际上,不是的。
这在 John Hable 的这个演示文稿 中解释得非常清楚:我们显示器的伽马 2.2(即 EOTF)实际上是一个“伽马向下”!而不是“伽马向上”!这让我非常困惑,因为在 Nuke 中,伽马 2.2 是一个“伽马向上”。所以在过去的十五年里,我已经习惯了这种行为……
但对于显示器来说,情况正好相反。所以不,我们并没有叠加两次相同的伽马校正,那样会完全搞砸!当我们保存一个显示参考图像时,我们是这样做的:
- 编码一个 jpg 文件,使用 OETF(或反向 EOTF),即“伽马向上”。
- 在具有 EOTF(很可能是 2.2 的“伽马”)的监视器/显示器上解码它,即“伽马向下”。
为了进一步澄清,我们可以在“调色”的语境中使用“伽马”这个词,也可以在“显示 EOTF”的语境中使用“伽马”这个词。你可以参考 Charles Poynton 的 FAQ 获取更多解释。
归根结底,我们不应该纠结于“伽马”这个词,它只是一个希腊字母!我们也可以将伽马函数描述为具有反转指数的幂函数,正如我试图在下表中总结的那样:
| 名称 | 函数 | 描述 | 艺术家友好术语 |
| sRGB OETF | (伽马)编码 | 对简单的 2.2 伽马函数(或 1/2.2 幂函数)的轻微调整 | “伽马向上”或“反向 EOTF” |
| sRGB EOTF | (伽马)解码 | 对纯 2.2 幂函数(或 1/2.2 伽马函数)的轻微调整 | “伽马向下” |
显示线性
很长一段时间以来,我一直认为“显示”和“线性”是对立的术语,好像它们不能共存。直到我读了 Cinematic Color:
电影和计算机图形社区在使用“线性”这个词来指代场景参考和显示参考的线性图像时都过于随意了。我们强烈鼓励这两个社区树立一个积极的榜样,即使在日常对话中也始终区分这两种图像状态。
为了澄清,你指的是显示器发出的线性光吗?你用了“伽马”这个词吗?你的图像超过 1.0 会有可怕的后果吗?如果是,请使用术语 显示线性。
你指的是高动态范围图像吗?你的中间灰是 0.18 吗?你在用“档”来谈论光线吗?1.0 在你的流程中没有特殊意义吗?如果是,请使用术语 场景线性。
对精确术语的恳求。
所以这可能有点让人费解,但我们在显示器上看到的、它们实际发出的光,是……“线性”的! 或者更准确地说,是“显示线性”的,因为对我们图像的编码和解码应该是一个无操作!
场景线性渲染空间示例
以下示例使用了 sRGB OETF,没有 LUT。我们将看到为什么这几乎是错误的。我做了几个非常简单的渲染,使用中间灰着色器来说明场景线性工作流:
- 非场景线性工作流:没有对值进行线性化。因此使用 0.5 进行渲染。
- 场景线性工作流:在我的场景中,中间灰是 0.18,这使我的计算正确。

010_colorManagement_260_linear_workflow_FHD
我承认这些渲染曝光过度,并不是说明我观点的最佳例子。
在这个非常有限的实验中,你可以看到在场景线性渲染中,从平面到球体的反弹更加“真实”。来自 Cinematic Color:
为什么场景线性在光照方面更受青睐?首先,渲染本身受益。物理上合理的光传输……例如全局光照,当给定具有高动态范围的场景时,会产生自然的结果。……光照着色器也受益于使用场景参考线性,特别是在光照衰减方面。……当与基于物理的着色模型结合使用时,使用 r² 光照衰减表现得非常自然。
r² 光照衰减只是二次衰减的另一种说法。
“线性”的混淆
场景线性的混淆
基本上,场景线性渲染为光照提供了正确的数学基础。 有很多网站展示了场景线性工作流的例子。但如果你仔细观察,你会发现它们在这里使用了一些“松散”的术语!所以对它们要持保留态度。
在 Nuke 中,这尤其令人困扰:“线性”被列为一种色彩空间,与 sRGB 或 Rec.709 并列。在 The Foundry 的支持页面上,你可以找到一个解释:“然而,Nuke 的色彩空间并不是一个标准的色彩空间。”伙计们,这应该用大大的红字写出来!
(第 7/9 段)

010_colorManagement_280_softwares_colorspace_FHD
这些“线性”选项困扰了我很长时间。
我认为值得指出的是,在场景线性空间下工作并不会让你神奇地获得无限的颜色范围。 你仍然需要考虑你正在使用的基色(或色域)。
显示线性的困惑
我们还需要一个关键要素来完善关于“线性工作流”的这一部分,那就是我们如何显示图像:
线性工作流的常见描述方式包含一个关键错误。 通常描述暗示观看过程只是简单地反转输入端的伽马调整。然而,这是错误的,会导致结果对比度过低、中间调灰色过亮、高光被裁切,从而迫使艺术家以不自然的方式调整灯光和材质来补偿。为了纠正这一点,观看变换必须考虑到输入是色彩科学家所说的“场景参考”,而显示器上显示的图像是“显示参考”这一事实。这意味着观看变换不应是简单的伽马变换,而是需要包含有时被称为色调映射的步骤。
作者:Doug Walker,Autodesk 色彩科学技术负责人。
让我们深入探讨!
色调映射
定义
我们现在要解释将场景线性转换为显示线性的部分。 大多数艺术家都知道这个过程是“色调映射”,但它也可以被称为“显示渲染变换”、“视图变换”或“输出变换”等。
色调映射是有意修改相对场景亮度值与显示亮度值之间关系的过程,通常旨在补偿特定显示器可实现的最小和最大亮度水平的限制、场景与再现之间观看环境差异相关的感知效应,以及偏好的图像再现特性。色调映射可以通过多种方式实现,但其净效果是通过相对场景亮度值与显示亮度值之间的关系来量化的。
Alex Forsythe.
在深入探讨这个话题之前,我们先看一些图片。
一个简单的视觉示例
查看下面的例子:这是同一个渲染的不同显示方式! 我重复一遍:来自渲染引擎的 exr 文件没有改变,只是我们查看它的方式不同。

010_colorManagement_310_lut_spi_anim_FHD
“色调映射”是正确显示场景线性渲染的唯一方法。
如果你不使用某种“色调映射”,每次你的镜头过曝时,你都必须手动补偿,并且你永远无法在场景中获得正确的能量感。
没有它,如果灯光过曝,你会降低灯光的强度。但是,你会损失一些来自全局光照 (GI) 的反弹,一些次表面散射 (SSS)……所以你可能需要创建大量灯光来补偿能量损失。这就是你最终得到一个由 50 盏灯组成的复杂布光装置的原因!
重要的是,“色调映射”不是可选项。为了正确审阅你的作品,使用适当的显示变换是强制性的。来自 Cinematic Color:
[…] 对于那些使用场景线性工作流的人,请记住使用超越简单伽马模型的观看变换。朋友不会让朋友在没有“S 形”视图变换的情况下查看场景线性图像。
Jeremy Selan.
胶片感
作为一名学生,我曾痴迷于获得胶片感和纯黑色,同时不让我的渲染看起来脏兮兮。实现这一点的唯一方法是使用“色调映射”。它会为你的图像提供适当的对比度,并优雅地处理任何超过 1 的像素。 这就是“胶片感”S 曲线的样子:

010_colorManagement_330_s_curve_FHD
(第 8/9 段)
所有介于 1 到 10 之间的场景参考值(X 轴)将被显示在 0.8 到 1 的范围内(Y 轴)。
摘自《Cinematic Color》:大多数色调渲染会将传统的场景灰度曝光映射到输出显示的中心值上。[…] 我们会添加一个大于 1:1 的重建斜率来提升中间调的对比度。当然,随着对比度的增加,阴影和高光会被严重裁切,因此会在高光和阴影两端应用低于 1:1 的对比度滚降,以使高光和阴影细节具有平滑的过渡。由于中间部分对比度高,两端对比度低,最终的曲线呈现出如下所示的“S”形。
查找表 (LUT)
“显示变换”通常不仅仅包含一个“简单”的色调映射操作。著名的 S 形曲线只是复杂系列操作中的一部分。这些算法有时可能很繁重,需要烘焙到查找表 (LUT) 中以进行实时计算。来自 Cinematic Color:
查找表 (LUT) 是一种优化函数计算的技术,这些函数计算成本高但缓存成本低。
LUT 也便于在不泄露任何知识产权 (“IP”) 的情况下共享数据。
借助一个数值列表(一个表),1D LUT 允许在标准动态范围显示器 (SDR) 上显示高动态范围图像 (HDR)。我们的显示器和电影放映机无法显示整个 HDR 范围(我们称它们为“显示 LUT”)。
LUT 描述
LUT 有几种类型,但我将在这里描述最常见的:
- 1D LUT(左图):它只包含一列数字,因为它以相同的方式影响 RGB 像素。它们通常包含一个传递函数和一个 S 形曲线(我以“Sony Pictures Imageworks Animation”的 vd16.spi1d 为例)。1D LUT 不会改变图像的色域。
- 3D LUT(右图):它包含三列数字,因为它以不同的方式影响 RGB 像素。它们可用于将一个色彩空间映射到另一个。我以 ACES 1.2 (Academy Color Encoding System) 配置中的 Rec. 709 for ACEScg Maya.csp 为例。3D LUT 允许你修改色域。
摘自 Cinematic Color:查找表 (LUT) 的特征在于其维度,即索引输出值所需的索引数量。

010_colorManagement_290_LUTs_FHD
为方便起见,我缩短了截图。这些文件实际上有数十万行。
我们也可以将 LUT 分为两类(尽管这可能被视为一种任意的区分):
- 技术性 LUT:例如“Cineon Log 转 Linear”的 spi1d LUT。
- 艺术性 LUT:例如“Look”或“Look Modification Transform” (LMT)。
LUT 也有多种文件格式可用:spi1d, spi3d, csp, cube…
OCIO (OpenColorIO)
要将 LUT 加载到 Maya, Nuke, Guerilla Render 或 Mari 中,我们将使用 OCIO 配置。OCIO 配置是在不同程序之间共享 LUT 的最简单方法。 你猜怎么着?有多个 OCIO 配置可以免费获取,以帮助你设置色彩管理工作流程。
OCIO 是一个用于配置和应用色彩变换的开源框架。[…] 它旨在将复杂的色彩管线决策推广给许多可能并不单独理解其中原理的人(即:非调色师)。
来自这篇文章 的绝佳 OCIO 定义。
以下是 Sony Picture Imageworks(左侧)和 ACES 1.2(右侧)的 OCIO 配置外观:

010_colorManagement_300_config_OCIO_FHD
为了显示方便,我也特意缩短了文件。
以下是关于 OCIO 配置的一些一般观察:
- 预定义了不同的角色,如 color picking, texture painting 或 compositing。请注意!
- 提供了不同的显示选项,如 DCI-P3, sRGB 或 Rec.709。
- OCIO 配置可在文本编辑器中编辑,通常包含一些描述来帮助你。
如果你有兴趣探索这个话题,我写过几篇关于“OCIO 和显示变换”和“画面构成”的文章。请注意,这是个深坑!
外观开发和 LUT
任何进行外观开发或渲染的人员使用相同的显示变换至关重要。 来自材质、毛发、特效、数字绘景、灯光和合成部门的艺术家需要看到相同的东西。对于 Mari, Substance Painter 或 Photoshop,有很多解决方案可以使我们的工作保持一致。
我可以在这里做个类比:我们通常需要在不同的 HDRI(或光照条件)下测试我们的外观开发资产,以确保它们反应良好。显示变换也是如此。在“中性”工作室 LUT 下处理资产,并检查其在“项目” LUT 下的效果,这种做法并不少见。
(第 9/9 段)
OCIO 配置文件非常方便,因为你可以在不同软件之间共享它们。你可以使用官方的配置文件,也可以用 Python(或手动)构建自己的。与视觉特效(VFX)相比,LUT 在动画电影中的应用来得相当晚,但它们确实在行业内带来了变革(Naughty Dog 就此发表了一些非常优秀的论文)。
输出建议
格式
我们已经为正确的色彩管理做好了准备,可以开始制作一些漂亮的渲染了。但是,我们如何以一种合适的格式来保存所有这些数值,尤其是那些大于 1 的值呢?这要感谢 ILM 发明了 OpenEXR。
OpenEXR 允许你以 16 位半浮点数保存,以保留所有“原始”数据。你还可以为你的合成流程写入一些任意输出变量(AOV)。你可以查阅 Arnold 关于 exr 文件的文档。
引自 Cinematic Color:在处理 float-16 数据时,重要的是要记住其比特分配方式与整数编码截然不同。整数编码在整个编码空间内均匀分配比特,而浮点编码则在低值端提高了精度,在高值端降低了精度。
同样值得一提的是,16 位或 32 位文件并不会神奇地让你获得无限的颜色范围。 你仍然需要考虑你正在使用的原色(或色域)。
我们在 Playmobil 项目上确实以 32 位渲染了一些 AOV:Ncam、Pcam 和 Pworld,以获得更好的精度。
用于 Z 深度和位置。
一个常见的误解是关于 EXR 文件的体积。我坚信它们实际上比大多数格式(如 TGA、TIF、PNG,有时甚至 JPG)都要轻量!只需使用适当的压缩方式,例如“DWAB”(由 Dreamworks Animation 开发)。
范围
最后,我们必须处理好我们的动态范围。基本上,你希望尽可能多地保留数据。有两个设置需要注意:
- 间接钳位值:钳制 GI 采样值。
- 抗锯齿钳位值:钳制像素值。
钳制 GI 采样值将帮助你减少噪点和萤火虫。我使用过的最低值是 10,这对我帮助很大。钳制像素值将有助于你的抗锯齿,以获得更平滑的结果。
如果一个非常暗的像素旁边有一个过曝的像素,你绝对不希望过曝的像素影响到它旁边的所有其他像素。这就是为什么我们要钳制渲染结果。
这也可能取决于你的场景和渲染引擎。 有些工作室将渲染钳位值设为 50。我曾尝试过低至 30 的情况……我想你需要自己尝试和测试,尤其是在 HDR 显示器上!Arnold 的开发者们很好地解释了钳制这个话题。
我们将在第 9 章中看到,为什么将像素值钳制得过低会成为一个问题。
总结
我们在本章中看到了一些重要且复杂的概念。希望我能够解释清楚,没有引起太多困惑。这里快速回顾一下:
- 一个色彩空间包含三个组成部分:三个原色、一个白点和一个传递函数。
- 传递函数(EOTF 和 OETF)、Gamma 函数和幂函数之间的区别。
- 色彩空间的不同属性:场景参考、显示参考和观看环境。
- 行业标准的介绍:sRGB、Rec.709、DCI-P3 和 Rec.2020。
- 场景线性和显示线性术语的重要性,以及“线性”的混淆之处。
- 场景线性工作流的优势以及色调映射的重要性。
- 通过 OpenColorIO(OCIO)配置文件使用不同的 LUT。
- 最后,如何将所有高动态范围数据保存到合适的文件格式:OpenEXR。
我们还了解到,你的渲染空间(或场景参考)应该始终具有线性传递函数,并且你绝对不应该在没有适当显示变换的情况下显示线性图像。
结论
色彩管理是一个永无止境的话题,我每天都在继续探索。我试图在这篇文章中以易于理解的方式向你介绍它。良好的色彩管理意味着你在整个色彩流程和不同软件中看到的是相同的东西。
如果你的颜色或对比度在从 Substance Painter 转到 Maya 时发生变化,可能值得分析一下问题所在。一个良好的色彩流程,关键在于从最初的草图(可能由美术部门完成)到最终交付,全程控制色彩空间。一致性是关键。
这是一段与我的前同事 Christophe Verspieren 一起探索色彩的漫长而精彩的旅程。但这并没有结束。那样就太简单了。如果你还有兴趣,我们可以继续学习关于学院色彩编码系统(ACES)的第 1.5 章。