Albedo 与 Pointer’s Gamut
引言
如果你直接在 ACEScg 中设置你的 基础颜色(或 漫反射颜色),重要的是要意识到在饱和度和亮度方面应该有一些限制。有人可能会问:漫反射颜色 的合理限制应该是什么?
以下是我的个人答案:Pointer 色域!在我们深入探讨其定义之前,让我们先退一步,好好审视一下 albedo。
Albedo 定义
在阅读了第 1 章(关于色彩管理)和第 1.5 章(关于 ACES)之后,你可能会问自己:我该从哪里开始? 如何正确设置所有这些值?有时,我们很难在纹理、灯光或调色之间正确平衡资产的外观开发。例如,在旋转展示中,我们的灯光应该有多强?或者我们的纹理应该有多亮、多饱和?
我个人认为 albedo 颜色是一个“稳定”的参考。 由于 albedo 来源于“现实生活”,将其视为平衡我们资产的合理方式是很自然的。
来自 Substance PBR 指南:表面的可见颜色是由于光源发出的波长。这些波长被物体吸收,并以镜面反射和漫反射两种方式反射。剩余的反射波长就是我们看到的颜色。

130_albedo_0010_apple_wavelengths_FHD
来自 Jeremy Selan:在真实场景中,如果你使用光谱辐射计等工具测量亮度值,可以观察到单个场景中非常广泛的值范围。[…] 非常暗的材料(如木炭)只反射一小部分入射光,通常在 3-5% 的范围内。作为一个单一数值,这种整体反射率被称为“albedo”。
Albedo 与反射
我们刚刚从 Substance 和 Jeremy Selan 那里得到了两个很好的定义。我认为非常值得停下来思考一下 albedo 到底是什么。因为关于它有很多误解。
来自 Wikipedia:表面反照率定义为 辐射出射度 与表面接收的 辐照度(单位面积通量)之比。[…] albedo 是在给定时间段内所有太阳角度上反射率的方向积分。
关于这个主题的精彩文章:Everything is shiny。
所有这些定义告诉我们什么?那就是你在 albedo 值中嵌入了一些镜面/光泽度信息。 这一点非常重要。
让我们以木炭为例。木炭并非纯 朗伯表面,在掠射角下你会得到一些 “镜面”反射。为了在 CG 中进行艺术控制,我们通常将漫反射和镜面反射分开,但在现实生活中它们其实是同一回事。
Thomas Mansencal 的解释。
漫反射颜色还是 Albedo AOV?
在现实生活中,albedo 同时包含 漫反射 和 镜面反射。 这是我们需要澄清的第一点。但许多渲染引擎,如 Guerilla Render,简化了这个过程:albedo AOV 就是 漫反射颜色(也称为 基础颜色 或 漫反射)。另一方面,Arnold 似乎做了“真实”的处理:
diffuse_albedo 中的菲涅尔效应是 镜面 IOR 的结果,以及它如何影响漫反射的 albedo 以实现能量守恒。因此,如果没有 镜面反射,diffuse_albedo 上就不会有菲涅尔效应,因为所有能量都在漫反射中。
来自 Arnold 文档。
我发现最后这部分特别有趣。我之前提到的关于 albedo 的误解可能就来自这些不同的行为。这对我们下一段内容尤其关键。
现在重要的是要记住,“地面实况”在某种程度上是模糊的:albedo 首先是一种与太阳辐照度相关的测量,当测量时,它包含了反射的漫反射和镜面反射分量。纹理几乎从未在直射阳光下拍摄。地面实况更应该是从光谱上测量表面的 BTF(双向纹理函数),并测量其偏振反射率:一种空间变化的偏振 BRDF(双向反射分布函数)。这将获得几乎完美的表面表示,但这样做你也会失去对它的所有艺术控制。否则,你可以查看 vrscans(VRScans 是非光谱 BTF)或 Quixel Megascans。
Thomas Mansencal 关于 albedo 相关挑战的论述。
Albedo 的限制是什么?
如果还不够清楚的话,我明确地将 颜色选择 分为两类:
- 灯光和自发光表面 -> Rec.2020 或 ACEScg 色域。
- 非发光表面的 Albedo 和 镜面颜色 -> Pointer 色域。
要获得饱和的颜色,光谱分布必须是窄带的。 激光,即一条线,是世界上最饱和的。这与表面恰恰相反,表面是相当平滑的。因此,由于其反射光谱分布的本质,它们不可能极其饱和。
Thomas Mansencal 的另一个解释。
(第 2/4 段)
因此,我们得到两个类别:
- 使用光源时,光谱变化剧烈,伴有尖峰。
- 使用自然或人造表面时,光谱非常平滑。
然而,你可能会遇到的问题是,当你用一个窄带光源照射表面时。你会发现自己处于这样一种情况:即使你的表面确实是平滑的,它反射的却是窄带光。因此,你最终可能会得到一个饱和度极高的表面(例如,这在音乐会场景中经常发生)。有时(通常是)结果并不如我们所愿,例如蓝色高光修复。
有趣的音乐会例子。非常直观!
最后,我不得不问他关于荧光的问题:
荧光实际上被认为是发射光。因此,它不像非发射表面那样受到限制。荧光只是以不同波长重新发射光。 我们甚至在洗衣业中谈论光学增白剂。
我喜欢当所有的点像这样开始连接起来的时候。
现有解决方案
对于这个问题:我们如何将反照率范围限制在 PBR 范围内? 工作室们提供了不同的答案。以下是我见过的一些解决方案:
- 一种技术检查,扫描反照率纹理,如果发现超出范围的值,则停止发布。
- 在着色器中直接设置一个软裁剪限制,以适应任何颜色输入的范围。
- 对反照率 AOV 进行视觉检查,查看是否存在超出范围的值(这意味着反照率 AOV 设置正确)。
所有这些解决方案都可以。即使大多数时候它们只考虑贴图的亮度。但是饱和度呢?这就是Pointer 色域派上用场的地方!
有趣的是,Thomas Mansencal 早在 2014 年就曾呼吁在 DCC 应用中引入色彩分析工具…!
我仅仅晚了六年。
Pointer 色域
我一直在想,是否有关于漫反射颜色/反射和饱和度的研究。直到我发现了Pointer 色域。我的大部分数据来自这篇文章。
首先,一个困扰很多人的非常基本的问题。为什么叫Pointer色域?其实很简单!1980 年,一位名叫 Michael Pointer 的科学家收集了 4000 多个参考样本研究它们的颜色,并提出了一个以他命名的色域。
Pointer 色域是(一个近似)人眼可见的真实表面颜色的色域,基于 Michael R. Pointer (1980) 的研究。[…] 这意味着任何材料物体表面能够反射的所有颜色都在 Pointer 色域之内。
这听起来完全像一个合理的解决方案。但是我们应该将Pointer 色域与什么进行比较呢?答案在同一篇文章中给了我们(读一下就知道):
Pointer 色域是为漫反射(哑光表面)定义的。 与漫反射相对的是镜面反射,或类似镜子的反射。通过镜面反射,物体可以反射出 Pointer 色域之外的颜色。
再清楚不过了。真的。
Pointer 色域最初是为柯达公司进行的一项研究,所使用的 4089 个样本列表并未公开。不过,你可以在RIT 网站上找到数据集。
基于 Pointer 色域的技术检查
我们绝对可以考虑开发一个应用程序,允许我们将基础颜色纹理与 Pointer 色域进行比较。一些工作室已经在内部开发了一些解决方案,而对于社区来说,一个开源软件将是非常受欢迎的。
关于这个Pointer 色域检查的一些建议:
- 重要的是防止大多数情况。
- Pointer 色域并非详尽无遗,它并不代表所有可能的反射率。
- Pointer 并没有测量所有实际的表面。他有一个相当有代表性的样本。
- 我们必须明智地应用所有这些,过滤掉 98% 的有问题的情况。
- 它不应该成为创造力的阻碍,相反,它应该有助于创造力。
- 这个系统不是为了阻止人们完成工作,而是为了帮助他们更好、更快地完成工作。
Pointer 色域示例值
我将在这里分享一些值,让你大致了解它们是否在 Pointer 色域内。但我们也不要太教条,因为在数字 RGB 场景渲染中,一切都是“错误”的……
| 色彩空间 | 在 Pointer 色域外 | 在 Pointer 色域内 | 备注 |
| Linear – sRGB | (1, 0, 0) | (0.9, 0.03, 0.03) – (0.9042, 0.0278, 0.0098) | 这让我想起了我的可乐罐渲染中使用的值。酷! |
| Linear – sRGB | (0, 1, 0) | (0.03, 0.5, 0.03) – (0.4618, 0.8201, 0.4270) | sRGB 绿色原色被“修正”以进入 PG。 |
| Linear – sRGB | (0, 0, 1) | (0, 0.06, 0.6) – (0.0641, 0.0225, 0.5637) | sRGB 蓝色原色被“修正”以进入 PG。 |
| Linear – sRGB | (0, 0, 0.6) | (0.05, 0.05, 0.6) | |
| Linear – sRGB | (0, 0, 0) | (0.0191, 0.0186, 0.0229) | 它几乎与木炭参考值匹配(见下图)。太好了! |
| Linear – sRGB | (1, 1, 1) | (0.7624, 0.7645, 0.7494) | 它几乎与新雪参考值匹配(见下图)。太棒了! |
| ACEScg | (1, 0, 0) | (0.6552, 0.1353, 0.0494) | 别忘了 ACEScg 原色在光谱轨迹之外! |
| ACEScg | (0, 1, 0) | (0.4985, 0.7630, 0.4471) | 别忘了 ACEScg 原色在光谱轨迹之外! |
| ACEScg | (0, 0, 1) | (0.0527, 0.0246, 0.4228) | 别忘了 ACEScg 原色在光谱轨迹之外! |
| ACEScg | (1, 1, 0) | (0.8473, 0.7838, 0.0741) | |
| ACEScg | (0, 1, 1) | (0.5891, 0.7720, 0.8745) | |
| ACEScg | (1,0,1) | (0.5827, 0.1991, 0.6153) |
反照率图表及其限制
现在,我们为漫反射有了一个明确的目标。我们可以将其转化为技术检查,甚至是一个反照率图表。
市面上有一些有趣的反照率图表可供参考,甚至来自不同的渲染引擎,比如 Unity 和 Unreal。由于这些值是从真实世界测量值中获得的,它们是很好的指导原则。同样有趣的是,木炭和雪通常是大多数反照率图表中的“极端”例子。
在我看来,没有人像Unity的Sebastien Lagarde那样深入研究过它们。早在 2013 年,Sebastien 就已经在谈论它们的用途和限制了。
我有时会看到着色器在反照率中使用 0 值。我同意 0 值可以是一种优化,因为没有值或 BSDF 需要计算。但要记住,在 RGB 渲染引擎中,0 值很可能会停止光线路径。
CG 反照率图表
我生成这些图表的过程非常简单。我将ACEScentral 上发布的一个图表、Sebastien Lagarde 的一个图表和Macbeth 色卡合并成一个。由于这些图表中的大多数都有 0 到 255 之间的 sRGB 值,我使用了这个转换器对它们进行归一化。我还不得不挖掘一下,以找到sRGB 下的 Macbeth 值。
(第 3/4 段)
整个过程,类似于此处展示的资产转换过程,可以通过将色卡导入 Nuke 并在查看器中直接拾取值来简化。

130_albedo_0020_albedo_chart_FHD
现在有两张色卡:一张包含 ACEScg 值,另一张包含 Linear – sRGB 值。亮度值来自 Nuke 的查看器。我按照亮度对反照率值进行了排序,因为我认为这样会更方便。色卡本身已保存为 png 文件,并使用了以下“色彩空间”:“Utility – sRGB – Texture”。
你可能需要“谨慎地”使用这些值,因为我们并不确切知道它们是否严格指漫反射率或反照率。根据我对木炭所做的渲染测试,这里有一些更准确的值(与 Unreal Engine 中的值 相符):
| 漫反射率 | 镜面反射率 | 总反照率 | |
| 木炭 | ~0.02 | ~0.02 | ~0.04 |
“新雪”的情况类似。有些图表显示反照率值为 0.9,有些是 0.81。我选择了较低的值,因为我更倾向于制作一个漫反射颜色值图表。这引出了我们的最终问题……
Macbeth 色卡值
Macbeth 色卡的值是漫反射反照率还是总反照率? 很久以前,一位同事使用交叉偏振法拍摄了物品的材质参考照片,当然,Macbeth 色卡具有镜面反射分量。[…] 但也许我们应该将在线 Macbeth 色卡(来自 colour-science)视为漫反射值,而任何参考带有色卡照片的人都需要补偿镜面反射分量?
我无法比 Thomas Mansencal 回答得更好,所以我直接引用他的话。
从测量和单位的角度来看,反照率旨在表示漫反射(太阳辐照度的反射)。问题是,尽管在建模 BRDF 时可以区分它们,但在现实生活中进行测量时确实很难做到。在某种程度上,镜面反射几乎总是漫反射的一个子集,毕竟它也是反射。当测量色卡的反射率时,是在特定的几何条件下进行的,例如 0:45(光线与切面对齐,接收器/传感器在 45 度角),测量的是入射光的总反射。因为光的辐照度是已知的,所以可以推断出表面的反射率。
我自己从未做过任何现实生活中的测量,所以我只是坐着听。以下是最后一部分:
这告诉你的是,没有镜面反射与漫反射的分离,它是全包含的。它还告诉你,如果你期望实现匹配,你应该在渲染引擎中匹配测量几何条件,因为这是唯一可以完全实现匹配的几何条件。
结论
尽管 Pointer 色域已有 40 年历史,但它仍然是着色器中反照率值的有效参考。但我们当然不应该成为它的奴隶,而应将其用作资产间保持一致性的指导原则。和往常一样,这些选择取决于你的艺术方向和工作流程。最近,软件工程师 Björn Ottosson 在推特上谈到了 Pointer 色域,并生成了这两张图片。

130_albedo_0040_reflectance_colors_FHD
展示了最亮和最暗的自然表面反射颜色是什么(使用 sRGB HSV)。如果你正在制作漫反射纹理,大多数时候你希望保持在这个范围内。更亮和更暗的反射颜色在物理上是可能的,但会相当罕见。这是一个很好的合理性检查,而不是严格的限制。此外,荧光色可能看起来更亮。
这种限制纹理值范围的概念可能会引发相当多的争论。但我认为,在做出这些决定时,记住这些概念是有用的。最后,我们用 Thomas 的话来结束:
嗯,一切都是情境相关的,将你的值锚定在现实世界中,作为一个起点,通常是获得更高质量的关键,这在某种程度上是 PBR 的基础。请记住,Pointer 色域仅与反射率有关 […] 。它关乎数字资产创作,特别是着色器和纹理的外观开发,在这些领域,人们往往需要追求物理准确性。[…] 这不是关于图像质量,而是关于物理正确性。像任何工具一样,必须理解其原理才能使用。PBR 验证工具 […] 可以说有助于提高 Lookdev 的一致性和整体图像质量。
(第 4/4 段)
这篇文章一个可能的改进方向是生成两张图表:一张用于漫反射率,另一张用于镜面反射率。这听起来像是未来一个有趣的作业!