Skip to content

光场、颜色与感知

前几章中,我们已经从几何、材质、光传输一路走到相机。相机会记录光,但最终画面并不是物理光的直接复制。光需要被传感器采样,被颜色空间编码,被显示设备发出,再被人眼和大脑解释。

这一章讨论两个容易被低估的问题:

  • 光场。 不只是“某个点有多少光”,而是空间中每个位置、每个方向都有光。
  • 颜色感知。 颜色不是光的单一物理属性,而是光谱、人眼、显示器和上下文共同形成的结果。

在最一般的意义上,光场描述空间中每一点、每个方向上的光线分布。也就是说,如果你站在场景中的某个位置,并朝某个方向看,能看到多少光、什么颜色,这就是光场的一部分。

渲染器生成图像时,相机其实是在光场中取样:

像素颜色 = 相机位置 + 像素方向 + 光圈位置 + 时间 + 波长 的采样结果

针孔相机只在一个位置和方向集合上采样;景深会加入光圈位置;运动模糊会加入时间;光谱渲染还会加入波长。维度越多,图像越真实,也越需要更多样本。

真实光不是天然的 RGB。光可以按波长分布,例如红光、绿光、蓝光只是可见光谱中的不同范围。一个光源可能在某些波长很强,在另一些波长很弱,这种分布称为光谱功率分布。

人眼有三类主要视锥细胞,对不同波长范围敏感。大脑根据这三类响应组合出颜色感觉。这就是为什么图形学常用三通道颜色表示:它不是因为世界只有 RGB,而是因为人类视觉可以在许多情况下用三个维度近似。

但这种近似也有限制:

  • 两个不同光谱可能让人眼产生相同颜色感觉,这叫同色异谱。
  • 相机传感器的响应曲线不等同于人眼。
  • 显示器只能发出有限色域内的颜色。
  • 某些材质在不同光源下会显色不同。

从光谱到显示颜色

RGB 是一种设备和颜色空间相关的编码方式。(1, 0, 0) 不是宇宙中的“红色本体”,而是某个颜色空间里红原色的最大值。

常见颜色空间包括:

  • sRGB。 最常见的标准显示颜色空间,网页和普通图片大量使用。
  • Display P3。 色域比 sRGB 更宽,常见于现代移动设备和显示器。
  • Rec.709。 高清电视和视频常用标准。
  • Rec.2020。 更宽色域的视频和 HDR 标准相关空间。
  • ACES。 影视制作中常用的色彩管理系统。

如果不说明颜色空间,RGB 数字本身是不完整的。不同颜色空间里的同一组 RGB 数字,可能代表不同的实际颜色。

图形学计算通常应该在线性空间中进行。因为物理光照是线性的:两盏相同灯叠加,亮度应该加倍;材质反射 50% 的光,也应该按线性比例计算。

但许多图片文件和显示编码使用非线性曲线,例如 sRGB 编码。这样做更符合人眼对亮度的敏感方式,也能更有效地利用 8 位存储。

常见错误是直接在 sRGB 数值上做光照计算:

错误直觉:在显示编码的颜色上直接相加、插值、乘光照
正确做法:先转到线性空间,完成光照计算,再编码回显示空间

如果忽略这个过程,画面可能出现过暗、过灰、渐变不自然、混合边缘错误等问题。

下面的小程序把几个颜色概念放在一起观察:RGB 混合、色温倾向、线性与 Gamma 编码差异。它不替代严谨的色彩管理,但能帮助你建立常用直觉。

左侧显示当前颜色与色温影响,右侧对比线性空间和显示编码中的中间亮度。颜色数值只有在明确颜色空间和转换规则后才有稳定意义。

可以尝试:

  • 改变 RGB 三个通道,观察同样数值在“线性”和“显示编码”里的亮度感差异。
  • 调节色温,观察偏暖和偏冷如何影响整张画面的白色基础。
  • 切换 Gamma 视图,观察中间灰为什么不是简单的视觉中点。

白色不是一个绝对固定的颜色。不同光源的白点不同:烛光偏暖,晴天阴影偏冷,显示器也有自己的白点设定。

色温通常用开尔文表示:

低色温:偏暖,常见于烛光、夕阳、钨丝灯
高色温:偏冷,常见于阴天、蓝天阴影

摄影和渲染中,白平衡用于决定“什么应该被看作白色”。如果白平衡不对,整张图会偏黄、偏蓝或偏绿。很多时候,这不是材质错了,而是观察条件和色彩适配没有处理好。

真实场景中的亮度范围非常大。阳光、高光、室内阴影、屏幕显示能力之间可能差出很多数量级。HDR 渲染会保留更大的亮度范围,但普通显示器不能直接显示无限亮度。

色调映射的作用是把 HDR 亮度压缩到显示范围,同时尽量保留视觉层次。

常见色调映射目标包括:

  • 保留暗部可见性。
  • 避免高光突然截断成纯白。
  • 保持颜色不过度失真。
  • 让画面对比符合创作意图。

色调映射不是简单地把所有数值除以最大值。好的色调映射更像摄影里的曝光和胶片响应:它决定亮部如何滚降,暗部如何抬起,中间调如何保持对比。

色域表示一个设备或颜色空间能表示的颜色范围。某些非常鲜艳的颜色可能在宽色域中可表示,但在 sRGB 中无法准确显示。

当颜色超出目标色域时,需要进行映射或裁剪。直接裁剪可能导致:

  • 高饱和区域丢失细节。
  • 颜色偏移。
  • 渐变出现断层。
  • 不同显示设备上观感差异很大。

这就是为什么专业流程需要色彩管理。渲染器、贴图、后期、显示器之间必须约定颜色空间,否则“同一张图”在不同软件里可能完全不一样。

人眼对亮度和颜色的感知具有强烈的上下文依赖。一个灰块放在暗背景上会显得更亮,放在亮背景上会显得更暗;同一个颜色在暖光和冷光下也会有不同感受。

几个重要现象:

  • 亮度感知非线性。 人眼对暗部变化更敏感,对极亮区域的相对变化不那么敏感。
  • 颜色恒常性。 大脑会尝试抵消光源颜色,让物体颜色保持稳定。
  • 同时对比。 周围颜色会影响中央颜色的观感。
  • 适应。 从室外进入室内后,视觉系统会逐渐适应新的亮度范围。

这些现象说明,图形学中的“正确数值”不一定等于“正确观感”。渲染最终要进入人的视觉系统,因此感知模型和艺术判断都很重要。

一个稳定的颜色流程通常需要明确每一步的数据意义。

  1. 确认输入贴图颜色空间。
    基础色通常是 sRGB 编码;法线、粗糙度、金属度这类数据贴图通常不应按颜色贴图解码。

  2. 把参与光照的颜色转为线性空间。
    光照、混合、插值和能量计算应在线性空间进行。

  3. 在 HDR 缓冲中累计光照。
    避免过早把高亮截断到 0 到 1。

  4. 进行曝光和色调映射。
    把物理或近似物理亮度压缩到显示范围。

  5. 转换到目标显示颜色空间。
    根据目标设备输出 sRGB、Display P3 或其他格式。

  6. 在真实显示设备上检查。
    不同屏幕亮度、色域和系统色彩管理都会影响观感。

颜色问题常常隐藏在渲染流程里,不一定是灯光或材质本身写错。

  • 画面整体发灰。 可能在线性和 sRGB 之间转换错误,或色调映射曲线过平。
  • 混合边缘发黑。 可能在非线性空间中插值或混合。
  • 高光颜色奇怪。 可能超色域后被裁剪,或色调映射改变了通道比例。
  • 贴图看起来太亮或太暗。 可能数据贴图被当作颜色贴图解码,或基础色没有正确转线性。
  • 不同软件显示不一致。 可能颜色配置文件、显示空间或查看变换不同。
  • HDR 图像像普通图片一样平。 可能曝光和色调映射没有合理设置。

调试颜色时,不要只盯着最终画面。要逐步检查输入贴图、线性化、HDR 值、色调映射前后结果和显示输出。

本章把图像从“相机记录光”推进到了“人如何看到颜色”:

  1. 光场描述空间中位置、方向、时间、波长等维度上的光分布。
  2. RGB 是颜色空间中的编码,不是物理光谱本身。
  3. 人眼三类视锥让三通道颜色近似成为可能,但也带来同色异谱等问题。
  4. 光照计算应在线性空间进行,再编码到显示空间。
  5. HDR、曝光和色调映射决定高动态范围亮度如何进入显示设备。
  6. 色域、白点、色温和视觉适应都会影响最终观感。

下一章会转向动画与模拟。静态画面告诉我们“某一刻看起来如何”,动画和物理模拟则开始回答“它如何随时间运动”。