光与颜色 (Light and Color)

引言核心思想

本章的核心目标是建立起我们日常在代码中使用的 RGB 颜色值真实世界物理光量之间的桥梁。理解这层关系是实现基于物理渲染 (Physically Based Rendering, PBR) 的基石。我们将从最纯粹的物理量开始,逐步加入人的感知因素,最终探讨在实时渲染中直接使用 RGB 进行计算的合理性与局限性。


8.1 光的量化 (Quantifying Light)

在精确模拟光线之前,我们必须学会如何科学地度量它。这里涉及三个循序渐进的学科。

8.1.1 辐射度量学 (Radiometry) - 纯粹的物理世界

核心观点: 辐射度量学是一套完全客观、不考虑人眼感知的物理量系统,用于测量电磁辐射。它是所有光照计算的物理基础。

关键术语与概念:

  • 光谱功率分布 (Spectral Power Distribution, SPD): 描述一束光在不同波长 (wavelength) 上能量分布的曲线。这是光的“指纹”,是描述光最完整的方式。
  • 辐射通量 (Radiant Flux, ): 单位时间内通过一个区域或由一个光源发出的总辐射能量,也称为功率 (Power)。可以理解为一束光“有多强”。
    • 单位: 瓦特 (W)
  • 辐照度 (Irradiance, ): 到达单位面积的辐射通量。它描述的是一个表面被光“照亮”的程度。
    • 单位:
  • 立体角 (Solid Angle, ): 二维角度在三维空间中的扩展,描述了从一个点看过去,一个物体在视野中所占的“大小”或方向的集合范围。
    • 单位: 球面度 (sr)
  • 辐射强度 (Radiant Intensity, ): 从一个点光源向某个单位立体角发出的辐射通量。它描述的是点光源在某个方向上的“发射强度”。
    • 单位:
  • 辐射度 (Radiance, ): 渲染中最核心的物理量。它描述的是沿着一条光线传播的单位面积、单位立体角的辐射通量。
    • 单位:
    • 关键特性 1: Radiance 是眼睛或摄像机传感器实际测量到的量。渲染管线的最终目标就是计算出从场景表面指向摄像机的每条光线的 Radiance 值。
    • 关键特性 2: 在真空中,Radiance 的值沿着其传播方向是恒定不变的。这意味着一个物体无论离你多远,它的表面亮度(Radiance)是不变的,只是它在你视野里占据的立体角变小了而已。

8.1.2 光度学 (Photometry) - 加入人的感知

核心观点: 光度学是辐射度量学的一个“感知加权”版本。它将纯物理的辐射量根据人眼对不同波长光线的敏感度进行加权,从而得到人眼实际感受到的“亮度”。

关键术语与概念:

  • CIE 光度曲线 (CIE Photometric Curve): 一条描述人眼对不同波长光线敏感度的钟形曲线,峰值位于 555nm (黄绿色)。这解释了为什么在能量相同的情况下,我们感觉绿光比红光或蓝光更亮。
  • 从辐射度量学到光度学:
    • 辐射通量 (Radiant Flux) 光通量 (Luminous Flux), 单位: 流明 (lumen)
    • 辐照度 (Irradiance) 光照度 (Illuminance), 单位: 勒克斯 (lux)
    • 辐射强度 (Radiant Intensity) 发光强度 (Luminous Intensity), 单位: 坎德拉 (candela)
    • 辐射度 (Radiance) 亮度 (Luminance), 单位: 尼特 (nit)

8.1.3 色度学 (Colorimetry) - 颜色的科学

核心观点: 色度学研究的是如何将光的物理 SPD 与人眼感知到的颜色联系起来。它解释了为什么我们可以用三个值(如 R, G, B)来表示出成千上万种颜色。

关键术语与概念:

  • 三色视觉理论: 人眼视网膜有三种对不同波长范围敏感的视锥细胞。大脑接收到这三种细胞的不同强度信号,组合成了我们所感知的颜色。
  • 同色异谱 (Metamers): 两个具有完全不同的 SPD 的光,却能刺激视锥细胞产生完全相同的响应,从而被感知为同一种颜色。这是 RGB 颜色系统能够成立的生理学基础。
  • CIE XYZ 色彩空间: 一个通过颜色匹配实验建立的、标准的、设备无关的色彩空间,是所有其他色彩空间的“总纲”。
    • 颜色匹配函数 (Color-Matching Functions, CMFs): 是三条曲线,用于将任意 SPD 转换为 XYZ 三色值。
    • 关键公式:从 SPD 到 XYZ
    • 重要关联: 分量被特意设计为与光度学中的亮度 (Luminance) 完全一致。
  • 色度 (Chromaticity, ): 颜色的“纯度”和“色调”,与亮度无关。通过将 XYZ 归一化到 的平面上得到。
  • CIE 色度图: 将所有可见颜色的色度绘制在一个二维马蹄形图上,直观地展示了颜色的范围。
  • 色域 (Color Gamut): 显示器等设备能表示的颜色范围,在色度图上通常表现为一个三角形。常见的色域有 sRGB (PC 显示器标准)、DCI-P3 (数字影院、现代 Apple 设备)、Rec. 2020 (超高清电视标准)。
  • 从 RGB 到亮度: 将线性 sRGB 值转换为人眼感知的灰度亮度,最常用的公式是: 注意绿色分量的权重最高,这与光度曲线一致。

8.1.4 使用 RGB 颜色进行渲染 - 一个有效的妥协

核心观点: 严格来说,直接用 RGB 值进行光照计算是物理不正确的,因为它忽略了光谱细节。但在大多数情况下,这是一个足够好的近似,并且极大地简化了计算。

  • 为什么“不正确”?

    • 正确流程: (光照SPD * 材质光谱反射率) -> 反射光SPD -> 转换为RGB
    • 实际流程: 光照RGB * 材质RGB -> 反射光RGB
    • 这种简化会引发同色异谱失效 (Metameric Failure) 问题:两种在某个光源下看起来颜色相同的材质(例如,两块都是“红色”),换一个光源后可能呈现出截然不同的颜色。RGB 渲染无法捕捉这种现象。
  • 为什么它在实践中可行?

    • 因为自然界中绝大多数光源的 SPD 和物体表面的光谱反射率曲线都是平滑、宽阔的,而不是充满尖锐的峰谷。在这种普遍情况下,RGB 乘法的结果与完整的光谱计算结果非常接近。
    • 对于游戏和大多数影视渲染,追求的是视觉上的可信度而非百分之百的物理精度预测。因此,RGB 渲染的效率优势远大于其精度上的微小损失。

8.2 从场景到屏幕 (From Scene to Screen) - 渲染的最后一步

核心观点: 我们在场景中计算出的颜色值(通常是线性的、高动态范围的 Radiance 值)并不能直接发送给显示器。必须经过一系列转换,才能在屏幕上正确地展示出来。

  • HDR 显示编码: 将场景中的高动态范围(HDR)线性光照值,编码成显示器可以接收的信号格式。
  • 色调映射 (Tone Mapping): 将 HDR 的亮度范围压缩到显示器有限的低动态范围(LDR)内,同时尽可能保留原始场景的对比度和细节。
    • 曝光 (Exposure): 色调映射中的一个关键步骤,模拟相机调整进光量的过程,用于控制最终画面的整体亮度。
  • 颜色分级 (Color Grading): 在色调映射之后进行的艺术性调整,用于修正颜色、营造氛围和实现特定的视觉风格。

本章总结与关键启示

  1. 分层理解光与色: 物理层 (辐射度量学) 感知层 (光度学 & 色度学) 应用层 (RGB渲染)。理解这个层次结构对解决渲染问题至关重要。
  2. Radiance 是核心: 渲染方程计算的就是 Radiance。它是连接场景物理与最终图像的桥梁。
  3. RGB 渲染是近似: 认识到我们日常使用的 color * albedo 是一个基于“平滑光谱”假设的简化。这有助于理解某些特殊材质(如多层镀膜、衍射光栅)为何难以用简单 RGB 模型表达。
  4. 渲染不等于显示: 渲染计算出的线性颜色值只是“中间产品”。色调映射颜色校正是决定最终画面观感的关键步骤,同样值得深入研究。

8.2 - 从场景到屏幕 (From Scene to Screen)

核心思想

渲染管线的前半部分致力于计算出场景中物理上正确的辐射度 (Radiance)。然而,这些原始的、线性的、高动态范围 (HDR) 的数据并不能直接显示。本节的核心任务是讲解如何通过一系列转换,将这些**“场景数据”优雅地映射为显示器最终呈现给玩家眼睛的“屏幕像素”**。这个过程既是科学,也是艺术。

关键概念: 图像状态 (Image States)

理解整个流程前,必须先掌握两个核心的图像状态定义,这是理解色调映射和颜色分级的基石。

  • 场景参考 (Scene-Referred): 图像的像素值代表虚拟场景中物理世界的光照强度 (Radiance)。它是线性的,并且拥有非常高的动态范围。所有基于物理的光照计算都必须在此状态下进行。
  • 显示参考 (Display-Referred): 图像的像素值代表显示器应该发出的光照强度。它的动态范围受限于显示器本身的能力。

核心流程图: 场景参考 (线性) → [色调映射] → 显示参考 (线性) → [显示编码] → 显示参考 (非线性) → 显示器


8.2.1 HDR 显示编码 (HDR Display Encoding)

核心观点: HDR 显示器相比传统 SDR 显示器拥有更广的色域 (Color Gamut)和更高的亮度 (Luminance)。为了利用这些能力,我们需要使用特定的标准将图像数据“打包”成它们能理解的格式。

关键术语与标准:

  • SDR 标准:

    • sRGB: PC 显示器标准。
    • Rec. 709: 高清电视 (HDTV) 标准。
    • 特点:色域较窄,亮度标准约为 (尼特)。
  • HDR 标准:

    • Rec. 2020: 定义了一个比 sRGB 宽得多的色域,是 UHD (超高清) 内容的标准。
    • Rec. 2100: 定义了传输 HDR 信号的两种关键编码函数。
      • 感知量化器 (Perceptual Quantizer, PQ): HDR 渲染中最常用的非线性编码曲线,可以编码高达 的亮度。它相当于 HDR 世界的 "Gamma 曲线"。
      • 混合对数伽马 (HLG): 另一种编码,在渲染中较少使用。
  • 一个重要的现实: 标准是理想化的。消费级 HDR 显示器的实际能力通常达不到 Rec. 2020 的完整色域和 10,000 尼特的亮度。它们的色域更接近 DCI-P3,峰值亮度也远低于标准。这意味着 HDR 显示器自身会进行一次内部的色调映射

主流 HDR 输出路径:

  1. HDR10: 最广泛支持的消费级标准。使用 PQ 编码Rec. 2020 色域,每通道 10-bit。缺点是每个显示器如何进行最终的色调映射是“黑盒”,效果不可控。
  2. scRGB (线性): Windows 独有。它巧妙地使用 sRGB 色域,但允许颜色值小于 0 或大于 1,从而编码 HDR 信息。优点是保持线性,易于使用且向后兼容,由驱动自动转换为 HDR10。
  3. Dolby Vision (杜比视界): 专有格式,12-bit,色调映射效果标准化。目前在 PC 和主机上支持较少。

8.2.2 色调映射 (Tone Mapping)

核心观点: 色调映射是“从场景到屏幕”流程中最核心的步骤。它的目标不是简单地“压缩”动态范围,而是要在显示器有限的能力下,尽可能复现出人眼观察原始场景时的主观感知印象

为什么需要复杂的色调映射?

  • 人眼的适应性 (Adaptation): 人眼会自动适应环境亮度,对相对对比度更敏感。
  • 感知效应: 在低亮度下,人眼感知到的对比度 (Stevens 效应) 和色彩饱和度 (Hunt 效应) 会下降。
  • 观看环境: 显示器周围的环境光、屏幕反光 (Display Flare) 会严重降低屏幕的实际对比度。
  • 结论: 为了在低动态范围的显示器上重建高动态范围场景的感知,我们通常需要主动提高图像的对比度和饱和度。这自然地导出了一个标志性的 S 型 (Sigmoid) 色调映射曲线,它能平滑地处理过暗和过曝的区域,保留细节,同时增强中间调的对比度。

色调再现变换 (Tone Reproduction Transform)

这是实现色调映射的具体算法或曲线。

  • 经典算子:
    • Reinhard: 早期简单的算子,能有效防止高光裁切,但可能导致暗部饱和度下降。
    • Hable "Filmic" Curve: 因用于《神秘海域2》而广为人知,旨在模拟胶片的质感和色彩响应,效果令人满意,影响力巨大。
  • 现代标准:
    • ACES (Academy Color Encoding System): 由电影学院推出的色彩管理系统,正迅速成为游戏和影视行业的标准
      • 模块化设计: 分为 RRT (参考渲染转换) 和 ODT (输出设备转换) 两部分,能灵活适应 SDR、HDR 等各种显示设备。
      • Unreal 和 Unity 引擎已默认支持或内置。
  • 先进实践 (寒霜引擎):
    • 避免色相偏移 (Hue Shift): 传统的色调映射直接作用于 RGB 通道,可能导致颜色(尤其是高光部分)发生不期望的色相偏移(例如,黄色火焰变成白色)。
    • 解决方案: 在一个感知均匀的色彩空间 (如 ) 中进行色调映射,仅调整亮度和饱和度,保持色相不变,从而获得更纯净、可控的结果。

曝光 (Exposure)

核心观点: 曝光是在应用色调映射曲线之前,对场景参考图像进行的一次线性缩放。它决定了场景的哪个亮度区间被置于色调映射曲线的“最佳”处理范围内。

  • 自动曝光技术:
    • 过时方法: 使用场景亮度的对数平均值。容易被少数极端亮或暗的像素干扰。
    • 现代方法: 使用亮度直方图 (Luminance Histogram)。通过分析直方图的中位数或百分位,可以得到一个更稳定、更鲁棒的曝光值,不受异常值影响。
  • 物理正确的曝光:
    • 核心思想: 曝光应该模拟相机,其目的是抵消场景光照的强度,从而更好地展现物体本身的颜色 (反照率)。
    • 实践: 曝光值应根据场景中的光照强度来计算,而不是最终渲染出的像素亮度。这是一种更高级但更准确的方法,能确保在不同光照环境下材质颜色表现的一致性。

8.2.3 颜色分级 (Color Grading)

核心观点: 颜色分级(或称调色)是一种艺术创作过程,目的是创造一种特定的视觉风格或氛围 (Look),让画面看起来比原始场景“更受欢迎”或更具情感表达力。

实现技术:

  • 3D 查找表 (LUT): 颜色分级涉及复杂的非线性颜色变换,无法用简单公式表达。因此,这些变换被“烘焙”到一个 3D LUT 中。在运行时,原始颜色作为 3D 坐标输入 LUT,直接查表得到变换后的颜色,效率极高。

工作流程的演进 (至关重要):

  1. 显示参考分级 (旧方法):色调映射之后应用 LUT。

    • 优点: 简单直观。
    • 缺点: 此时图像数据已被压缩到低动态范围,大量颜色信息已经丢失,进行分级操作会破坏画质,容易出现色阶断层 (Banding) 等瑕疵
  2. 场景参考分级 (现代最佳实践):色调映射之前应用 LUT。

    • 优点: 在完整的、线性的、高动态范围数据上进行颜色变换,保真度极高,能产出电影级的平滑过渡和丰富的色彩细节。这是当前业界的主流和推荐做法。
    • 实践中,可以将色调映射曲线本身也一起烘焙进这个 LUT,从而将颜色分级和色调映射合并为一个高效的查找操作。