光场、颜色与感知
前几章中,我们已经从几何、材质、光传输一路走到相机。相机会记录光,但最终画面并不是物理光的直接复制。光需要被传感器采样,被颜色空间编码,被显示设备发出,再被人眼和大脑解释。
这一章讨论两个容易被低估的问题:
- 光场。 不只是“某个点有多少光”,而是空间中每个位置、每个方向都有光。
- 颜色感知。 颜色不是光的单一物理属性,而是光谱、人眼、显示器和上下文共同形成的结果。
在最一般的意义上,光场描述空间中每一点、每个方向上的光线分布。也就是说,如果你站在场景中的某个位置,并朝某个方向看,能看到多少光、什么颜色,这就是光场的一部分。
渲染器生成图像时,相机其实是在光场中取样:
像素颜色 = 相机位置 + 像素方向 + 光圈位置 + 时间 + 波长 的采样结果针孔相机只在一个位置和方向集合上采样;景深会加入光圈位置;运动模糊会加入时间;光谱渲染还会加入波长。维度越多,图像越真实,也越需要更多样本。
从光谱到颜色
Section titled “从光谱到颜色”真实光不是天然的 RGB。光可以按波长分布,例如红光、绿光、蓝光只是可见光谱中的不同范围。一个光源可能在某些波长很强,在另一些波长很弱,这种分布称为光谱功率分布。
人眼有三类主要视锥细胞,对不同波长范围敏感。大脑根据这三类响应组合出颜色感觉。这就是为什么图形学常用三通道颜色表示:它不是因为世界只有 RGB,而是因为人类视觉可以在许多情况下用三个维度近似。
但这种近似也有限制:
- 两个不同光谱可能让人眼产生相同颜色感觉,这叫同色异谱。
- 相机传感器的响应曲线不等同于人眼。
- 显示器只能发出有限色域内的颜色。
- 某些材质在不同光源下会显色不同。
RGB 不是物理颜色本身
Section titled “RGB 不是物理颜色本身”RGB 是一种设备和颜色空间相关的编码方式。(1, 0, 0) 不是宇宙中的“红色本体”,而是某个颜色空间里红原色的最大值。
常见颜色空间包括:
- sRGB。 最常见的标准显示颜色空间,网页和普通图片大量使用。
- Display P3。 色域比 sRGB 更宽,常见于现代移动设备和显示器。
- Rec.709。 高清电视和视频常用标准。
- Rec.2020。 更宽色域的视频和 HDR 标准相关空间。
- ACES。 影视制作中常用的色彩管理系统。
如果不说明颜色空间,RGB 数字本身是不完整的。不同颜色空间里的同一组 RGB 数字,可能代表不同的实际颜色。
线性空间与 Gamma
Section titled “线性空间与 Gamma”图形学计算通常应该在线性空间中进行。因为物理光照是线性的:两盏相同灯叠加,亮度应该加倍;材质反射 50% 的光,也应该按线性比例计算。
但许多图片文件和显示编码使用非线性曲线,例如 sRGB 编码。这样做更符合人眼对亮度的敏感方式,也能更有效地利用 8 位存储。
常见错误是直接在 sRGB 数值上做光照计算:
错误直觉:在显示编码的颜色上直接相加、插值、乘光照正确做法:先转到线性空间,完成光照计算,再编码回显示空间如果忽略这个过程,画面可能出现过暗、过灰、渐变不自然、混合边缘错误等问题。
交互辅助:RGB、色温与 Gamma
Section titled “交互辅助:RGB、色温与 Gamma”下面的小程序把几个颜色概念放在一起观察:RGB 混合、色温倾向、线性与 Gamma 编码差异。它不替代严谨的色彩管理,但能帮助你建立常用直觉。
可以尝试:
- 改变 RGB 三个通道,观察同样数值在“线性”和“显示编码”里的亮度感差异。
- 调节色温,观察偏暖和偏冷如何影响整张画面的白色基础。
- 切换 Gamma 视图,观察中间灰为什么不是简单的视觉中点。
白色不是一个绝对固定的颜色。不同光源的白点不同:烛光偏暖,晴天阴影偏冷,显示器也有自己的白点设定。
色温通常用开尔文表示:
低色温:偏暖,常见于烛光、夕阳、钨丝灯高色温:偏冷,常见于阴天、蓝天阴影摄影和渲染中,白平衡用于决定“什么应该被看作白色”。如果白平衡不对,整张图会偏黄、偏蓝或偏绿。很多时候,这不是材质错了,而是观察条件和色彩适配没有处理好。
HDR 与色调映射
Section titled “HDR 与色调映射”真实场景中的亮度范围非常大。阳光、高光、室内阴影、屏幕显示能力之间可能差出很多数量级。HDR 渲染会保留更大的亮度范围,但普通显示器不能直接显示无限亮度。
色调映射的作用是把 HDR 亮度压缩到显示范围,同时尽量保留视觉层次。
常见色调映射目标包括:
- 保留暗部可见性。
- 避免高光突然截断成纯白。
- 保持颜色不过度失真。
- 让画面对比符合创作意图。
色调映射不是简单地把所有数值除以最大值。好的色调映射更像摄影里的曝光和胶片响应:它决定亮部如何滚降,暗部如何抬起,中间调如何保持对比。
色域表示一个设备或颜色空间能表示的颜色范围。某些非常鲜艳的颜色可能在宽色域中可表示,但在 sRGB 中无法准确显示。
当颜色超出目标色域时,需要进行映射或裁剪。直接裁剪可能导致:
- 高饱和区域丢失细节。
- 颜色偏移。
- 渐变出现断层。
- 不同显示设备上观感差异很大。
这就是为什么专业流程需要色彩管理。渲染器、贴图、后期、显示器之间必须约定颜色空间,否则“同一张图”在不同软件里可能完全不一样。
人眼感知不是线性的
Section titled “人眼感知不是线性的”人眼对亮度和颜色的感知具有强烈的上下文依赖。一个灰块放在暗背景上会显得更亮,放在亮背景上会显得更暗;同一个颜色在暖光和冷光下也会有不同感受。
几个重要现象:
- 亮度感知非线性。 人眼对暗部变化更敏感,对极亮区域的相对变化不那么敏感。
- 颜色恒常性。 大脑会尝试抵消光源颜色,让物体颜色保持稳定。
- 同时对比。 周围颜色会影响中央颜色的观感。
- 适应。 从室外进入室内后,视觉系统会逐渐适应新的亮度范围。
这些现象说明,图形学中的“正确数值”不一定等于“正确观感”。渲染最终要进入人的视觉系统,因此感知模型和艺术判断都很重要。
渲染流程中的颜色管理
Section titled “渲染流程中的颜色管理”一个稳定的颜色流程通常需要明确每一步的数据意义。
-
确认输入贴图颜色空间。
基础色通常是 sRGB 编码;法线、粗糙度、金属度这类数据贴图通常不应按颜色贴图解码。 -
把参与光照的颜色转为线性空间。
光照、混合、插值和能量计算应在线性空间进行。 -
在 HDR 缓冲中累计光照。
避免过早把高亮截断到 0 到 1。 -
进行曝光和色调映射。
把物理或近似物理亮度压缩到显示范围。 -
转换到目标显示颜色空间。
根据目标设备输出 sRGB、Display P3 或其他格式。 -
在真实显示设备上检查。
不同屏幕亮度、色域和系统色彩管理都会影响观感。
常见颜色问题
Section titled “常见颜色问题”颜色问题常常隐藏在渲染流程里,不一定是灯光或材质本身写错。
- 画面整体发灰。 可能在线性和 sRGB 之间转换错误,或色调映射曲线过平。
- 混合边缘发黑。 可能在非线性空间中插值或混合。
- 高光颜色奇怪。 可能超色域后被裁剪,或色调映射改变了通道比例。
- 贴图看起来太亮或太暗。 可能数据贴图被当作颜色贴图解码,或基础色没有正确转线性。
- 不同软件显示不一致。 可能颜色配置文件、显示空间或查看变换不同。
- HDR 图像像普通图片一样平。 可能曝光和色调映射没有合理设置。
调试颜色时,不要只盯着最终画面。要逐步检查输入贴图、线性化、HDR 值、色调映射前后结果和显示输出。
本章把图像从“相机记录光”推进到了“人如何看到颜色”:
- 光场描述空间中位置、方向、时间、波长等维度上的光分布。
- RGB 是颜色空间中的编码,不是物理光谱本身。
- 人眼三类视锥让三通道颜色近似成为可能,但也带来同色异谱等问题。
- 光照计算应在线性空间进行,再编码到显示空间。
- HDR、曝光和色调映射决定高动态范围亮度如何进入显示设备。
- 色域、白点、色温和视觉适应都会影响最终观感。
下一章会转向动画与模拟。静态画面告诉我们“某一刻看起来如何”,动画和物理模拟则开始回答“它如何随时间运动”。