概念页
色度学与色彩空间
Colorimetry & Color Spaces
色度学研究光谱功率分布与颜色感知的关系。人眼只有三种视锥细胞,所以三个数就能精确表示任意颜色刺激;CIE XYZ 是标准的三刺激值空间,各种 RGB 色彩空间由三原色和白点定义,可用 3×3 矩阵互相转换。实时渲染用 RGB 而非光谱计算,严格说是范畴错误,但对非预测性渲染效果出奇地好。
颜色匹配与同色异谱
- 人类能分辨约 1000 万种颜色。视网膜有三种视锥受体,对给定 SPD 大脑只收到三个信号。
- CIE 颜色匹配实验:三盏近单色灯 r (645 nm)、g (526 nm)、b (444 nm) 叠加,调节旋钮匹配旁边的单波长测试色;某些颜色需要负权重(即把那盏灯加到测试色一侧)。权重随波长变化的函数称为颜色匹配函数。
- 把颜色匹配函数乘以任意 SPD 再积分,就得到三个匹配权重。SPD 差别很大却得到相同权重、看起来一样的光谱称为同色异谱 (metamers)。
CIE XYZ 与色度图
- 因 r、g、b 匹配函数有负值,CIE 定义了三个假想光源(其 SPD 在某些波长为负,物理上不可实现),匹配函数 处处非负,是原函数的线性组合。 就是明视觉光度曲线。
- 色度是与亮度无关的颜色特征(深浅两种蓝可以色度相同)。投影到 平面: 不提供额外信息。 构成 CIE 1931 色度图:曲线边界是可见光谱色,连接两端的直线是紫线;D65 是常用白点。色度加亮度 即 xyY 坐标。
- 从白点经色点连到边界:相对距离为兴奋纯度,边界点为主波长;图形学中一般用大致对应的饱和度和色相。
色域
- 显示器的三原色各按 RGB 值缩放后相加得到一个 SPD。色度图中的三角形就是色域,三个角是能显示的最饱和红、绿、蓝;RGB 相等时得到白点。完整色域是三维体,色度图只是其投影。
- 比较 RGB 空间宜用 CIE 1976 UCS 图(属 CIELUV):XYZ 中感知差异相同的颜色对,距离可差 20 倍,CIELUV 最多 4 倍。ICTCP、Jzazbz 更均匀(尤其高亮度高饱和),但其色度图尚未普及。
常用 RGB 空间
| 空间 | 说明 |
|---|---|
| sRGB | 实时渲染中最常用;与 Rec. 709(HDTV,对主机重要)原色和白点相同。这里指线性空间,不是第 5 章的非线性 sRGB 编码 |
| Adobe 1998 | 部分修图显示器 |
| DCI-P3 | 源自电影制作,Apple 全线产品采用;常被当作 UHD 的事实色彩空间 |
| Rec. 2020 | UHD 规定的极宽色域,与 ACEScg 很接近 |
| ACEScg | AMPAS 为电影 CG 渲染开发的工作空间,不用于显示 |
- 更宽色域的使用可能增加:除了服务宽色域显示器,乘法等运算在不同空间结果不同,有证据表明在 DCI-P3 或 ACEScg 中运算比线性 sRGB 更准确。
- RGB→XYZ 是由原色和白点推导的线性矩阵,求逆和级联可得任意两空间间的转换。转换后值可能为负或大于 1,即超出色域,需要色域映射。
灰度亮度
亮度就是 Y,所以是 RGB 与 RGB→XYZ 矩阵中间行的点积。sRGB / Rec. 709: 系数来自光度曲线乘以三原色 SPD 再积分;三者不相等是因为人眼对不同波长灵敏度不同。
颜色外观与掩蔽
- 色度学能判断两个刺激是否匹配,但不能预测外观;外观受光照、周围颜色、先前状态影响,颜色外观模型(如 CIECAM02)试图预测。
- 掩蔽:物体上高频高对比图案(如波斯地毯纹理)会掩盖色带等着色瑕疵,这类表面可以少花渲染精力。
用 RGB 渲染
- 严格正确的做法是用光谱量(密集采样或投影到基)计算,最后再转 RGB;RGB 渲染直接相乘光源与表面的 RGB 颜色,一般情况下不正确。
- 极端例子:为激光投影设计的幕布材质在投影仪波长处有窄反射峰,反射约 80% 的激光投影光,却只反射不到 20% 的 D65 光;而 RGB 渲染会预测两者反射相同。
- 实际表面的光谱反射率曲线平滑得多(如香蕉),常见光源像 D65,此时误差相当细微。
- 预测性渲染中细微误差很重要:两种反射率可能在一种光源下外观相同、在另一种下不同(同色异谱失效,如汽车补漆)。
- 对大多数交互应用 RGB 渲染效果出奇地好;连电影离线渲染也只是最近才开始用光谱渲染,且远未普及。
GEA 的视角:从光谱到 RGB(卷 II 11.2.3)
GEA 从光的能量出发,一步步推到 sRGB,路线与本页类似,但补充了几处具体数据。
光谱功率分布与三刺激曲线
- 单色光的所有光子波长相同(如 550 nm 的绿色激光);多数光是混合波长,用光谱功率分布 (SPD) 描述,单位 W/nm。太阳光的 SPD 是覆盖整个可见光谱、略倾斜的起伏线;绿色激光只在 550 nm 有一个尖峰。,对波长积分得到总辐射功率(卷 II 11.2.3.2)。
- 视网膜有三种视锥细胞:L(长波,偏红)、M(中波,偏绿)、S(短波,偏蓝靛)。三条响应曲线 、、 称为三刺激曲线,纵轴无单位,是相对响应。人对亮度的感知近似线性,亮度曲线 几乎正好是三条曲线之和,峰值为 1(卷 II 11.2.3.3)。
同色异谱与颜色编码系统
- 人眼只能感知三种视锥被刺激的程度,所以有无数种 SPD 看起来是同一种颜色,称为同色异谱 (metamers)。正因如此,三个数就足以描述感知到的颜色;把三元组映射到颜色的方法叫颜色编码系统,因为三元组像三维向量空间,也叫色彩空间(卷 II 11.2.3.5)。
CIE RGB 与 CIE XYZ
- 1920 年代 CIE 选三个单色原色:700 nm(红)、546.1 nm(绿)、435.8 nm(蓝),它们靠近三条曲线的峰值,又能用当时现成的光源精确复现。受试者调节三盏原色灯去匹配各个单色色块,得到颜色匹配函数 、、;任意 SPD 的颜色就是 与这三条曲线乘积的积分(卷 II 11.2.3.6)。
- CIE RGB 的问题:匹配曲线在某些波段为负(某些纯色在三原色三角形之外,就像三角形外的点至少有一个负的重心坐标),而且亮度分散在三个分量中。CIE XYZ 对匹配函数做线性变换,使 、、 处处为正,并让 与 非常接近,于是 直接就是亮度(卷 II 11.2.3.7)。
- 把 各除以三者之和得到只含色度的 ,三者和为 1,只需给出 、;再加上原始的 表示亮度,就是 xyY 色彩空间。
色度图、sRGB 与其他 RGB 空间
- 所有真实颜色的 构成倾斜的马蹄形色域:单色光在弯曲边缘上,红在右端、紫在左端,连接两端的直线叫紫线 (line of purples),中间某点是白点(卷 II 11.2.3.8)。
- sRGB 的三原色是 xy 色度图中的固定点,所以色域是三角形,只覆盖马蹄形的一部分;GEA 认为被排除的颜色与三角形内的邻近颜色感知差别不大,实际问题不大。书中给出三原色的 :红 (0.64, 0.33, 0.212639)、绿 (0.3, 0.6, 0.715169)、蓝 (0.15, 0.06, 0.072192)(卷 II 11.2.3.9)。
- 其他 RGB 空间:老式模拟电视的 NTSC 只覆盖 sRGB 色域的约 35%;DCI-P3 比 sRGB 多覆盖一些;Adobe RGB 更宽,能更忠实地还原绿色和青色的细微层次,常用于专业图像制作(卷 II 11.2.3.10)。本页「常用 RGB 空间」表中 DCI-P3 的用途描述来自 RTR4,GEA 称 DCI-P3 是"为数码相机设计的",两书说法不同,并列记录(GEA 的说法有误,见下方原书问题)。
RGB 立方体、柱坐标空间与 LUV
- RGB 色域可看作 0 到 1 的立方体,原点为黑、(1,1,1) 为最亮的白。颜色可以像向量一样相加、乘标量调亮度、逐分量相乘(其中一个当作反射率);但不能做点积叉积,分量也不会为负,立方体只占第一卦限。GEA 承认人对亮度的感知是非线性的,线性 RGB 运算并不严格正确,但对渲染引擎足够,而真正正确的颜色乘法代价过高(卷 II 11.2.3.11)。
- HSL、HSV(又叫 HSB)、HSI 把 RGB 立方体映射成半径和高都为 1 的圆柱:色相是绕中轴的角度,饱和度是离轴距离,明度沿轴向。适合在编辑器里选色;三者没有统一标准,细节各不相同(卷 II 11.2.3.12)。
- CIE 1976 LUV 是为解决 xyY 感知不均匀而提出的感知均匀空间:(U, V) 大致对应 (x, y),L 表示亮度、大致对应 (卷 II 11.2.3.13)。这与本页提到的 CIELUV/UCS 是同一个体系。
原书问题(11.2.3):
- 不是三条视锥曲线之和:GEA 说亮度感知是三种视锥响应之和、"几乎正好"是 。实际上明视觉亮度主要由 L 和 M 视锥决定,S 视锥对亮度的贡献可以忽略,常用近似是 (Sharpe、Stockman 等 2005,"A luminous efficiency function, V*(λ), for daylight adaptation",J. Vision 5(11);Wikipedia "Luminous efficiency function")。另外 CIE 1924 的 本身就是 CIE 1931 的 (按定义相等,而不只是"非常接近"),且已知低估了蓝端的贡献(同一 Wikipedia 条目)。
- CIE RGB 的来历与原色选择:配色实验是 W. D. Wright 和 J. Guild 在 1920 年代分别做的,CIE 在 1931 年据此制定 CIE RGB/XYZ,并不是"CIE 在 1920 年代定义";700 nm 红原色远离 L 视锥约 560 nm 的峰值,选它是因为光谱长波端色相几乎不随波长变化,546.1 nm 和 435.8 nm 则是汞灯谱线、便于精确复现(Wikipedia "CIE 1931 color space")。
- NTSC 色域:GEA 说 NTSC"只覆盖 sRGB 色域的约 35%"。1953 年 NTSC 原色(R 0.67/0.33,G 0.21/0.71,B 0.14/0.08)构成的三角形比 sRGB 更大;约 35% 是 sRGB 占 CIE 1931 xy 色度图的比例(Wikipedia "sRGB":约 35.9%;"NTSC" 条目的色度坐标)。显示器参数里常见的"72% NTSC"指的就是 sRGB 面积约为 NTSC 1953 的 72%。
- DCI-P3 用途:DCI-P3 是 Digital Cinema Initiatives 2005 年为影院数字电影放映(发行母版)定义的色彩空间,Apple 的 Display P3 是其 D65 变体,不是"为数码相机设计的"(Wikipedia "DCI-P3";SMPTE RP 431-2:2011)。
- CIELUV 的 L:CIE 1976 的 是明度 (lightness),(暗部用线性段),是亮度 的非线性函数,不是"亮度"本身;感知均匀的含义是色彩空间中等距离对应近似相等的感知色差,而不是"各分量的等量变化感知相同"(Wikipedia "CIELUV")。
PBRT 的视角:三刺激值、XYZ/RGB 矩阵与标准色彩空间(PBRT 4e 4.6.1–4.6.3)
- 三刺激理论:任何光谱对人眼都可以用三个数表示,。由此得到的色彩空间是线性空间:光谱相加对应三刺激值相加、光谱缩放对应三刺激值缩放;但光谱相乘不对应三刺激值相乘,这正是用 RGB 渲染不准确的根源(见 光谱渲染)。
- XYZ 的归一化:PBRT 把三个积分都除以 (式 4.22),并给出 。pbrt 的匹配曲线以 1 nm 间隔覆盖 360–830 nm;两个光谱之间的一维内积用整数波长上的黎曼和,不用蒙特卡洛;对只有几个采样波长的
SampledSpectrum,则用蒙特卡洛估计 (式 4.23)。 - 虚色:所有光谱都有 XYZ 坐标,但不是所有 XYZ 坐标都对应可实现的光谱;单色光沿 xy 色度图的弧形边界分布,马蹄形以外是虚色。xyY 把色度与亮度分开,pbrt 只提供 XYZ↔xy(Y) 的转换函数。
- RGB 三元组本身没有意义:同一个 RGB 在 LCD 与 LED 显示器上发出的光谱截然不同;若已知显示器的 ,可以把 展开成 3×3 矩阵(式 4.24),各元素是响应曲线与匹配曲线乘积的积分。
- 由原色色度和白点构造 RGB→XYZ 矩阵:把三个原色 xy 换成 XYZ 列向量 ,RGB 必须映射到白点 ,所以 ,解出 ,;其逆即 XYZ→RGB。两个色彩空间之间经 XYZ 中转得到转换矩阵。pbrt 内置 sRGB、DCI-P3、Rec2020、ACES2065-1;ACES2065-1 的原色是虚色,能表示全部可见色,适合长期存档。
- 白点:白是一种颜色而非等能光谱,真实"白光"在蓝绿端能量更多;常用 D65(见 辐射度量学与光度学 的标准光源)。pbrt 的
RGBColorSpace保存完整的白点光谱而不只是色度,以便把 RGB 光源颜色转成光谱。 - 与 RTR4 对照:RTR4 在本页"用 RGB 渲染"一节说 RGB 渲染在多数情况下够用、只在特殊情况出错;PBRT 用 4.6.4 的乘法例子说明出错程度取决于所选色彩空间,因此坚持光谱渲染。两种立场并列记录,详见 光谱渲染。
出处
- realtime_rendering_4ed.pdf 第 8 章 Light and Color
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.2.3 节
- PBRT 4e source excerpt: chapter 04 (Radiometry, Spectra, and Color)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 4 章 4.6.1–4.6.3 节,pbr-book.org/4ed/Radiometry,_Spectra,_and_Color
相关页面
图形学辐射度量学与光度学Radiometry & Photometry辐射度量学精确度量电磁辐射,是基于物理渲染的第一步;光度学用人眼灵敏度对它加权。渲染中最重要的量是辐射亮度 L:眼睛和相机测的就是它,着色方程要算的也是沿视线的辐射亮度。图形学显示编码与 sRGBDisplay Encoding & sRGB光照、纹理等计算假设数值是线性的,但显示缓冲和纹理使用非线性编码。简短的回答是:着色器输出 [0,1] 的颜色要取 1/2.2 次幂(gamma 校正),读入的纹理和颜色做相反的变换,多数情况下可以让 GPU 自动完成。忽略它会导致画面偏暗、色相偏移、光照叠加错误和抗锯齿边缘"绳索化"。图形学色调映射Tone Mapping色调映射把场景参考的辐射亮度转换为显示参考的辐射亮度,目标不是恒等复现、也不是把所有信息"挤进"显示范围,而是在显示条件下尽量复现观看原场景时的感知印象。它通常是曝光缩放加一条 S 形曲线(全局映射),之后可做调色;最后由显示编码输出到 SDR 或 HDR 显示器。图形学卡通着色Toon Shading非真实感渲染 (NPR,也称风格化渲染) 不追求照片般逼真,而是追求特定目的或画风。卡通 / cel 渲染是其中最受关注的一种:用实线分隔大块纯色区域。表面着色常用纯色填充、两色"硬着色"、或对最终图像做色调分离 (posterization);描边见 轮廓边与几何描边。图形学像素与帧缓冲优化Pixel & Framebuffer Optimization需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。图形学光谱渲染Spectral Rendering光谱渲染 (Spectral Rendering) 在光传输中直接处理波长,而不是 RGB 三元组。pbrt 第 4 版在每条相机光线上随机采样少数几个波长(默认 4 个),把光谱积分并入渲染本来就在做的蒙特卡洛积分;最后用颜色匹配函数估计像素的 XYZ/RGB。输入端的 RGB 颜色则通过"sigmoid 二次多项式"转换成平滑光谱。本页按 PBRT 4e 4.5、4.6.4–4.6.6 节整理。图形学着色器中的颜色Color in Shaders在 GLSL 里颜色与空间坐标共用 vec2/vec3/vec4:可用 .rgba / .xyzw / .stpq 或下标访问,并 swizzle 任意重排。mix 在 [0,1] 上混合;HSB(HSV)比 RGB 更直观,还可映到极坐标色轮。