2. 色彩科学核心:CIE 1931 XYZ色彩空间、色度图、色域、白点、色温
在DRM CRTC驱动中配置Gamma校正与色彩管理,必须理解底层色彩科学模型。CIE 1931 XYZ色彩空间是几乎所有现代色彩管理系统的数学基础,它基于人眼视觉感知实验,将颜色定义为三个虚拟原色(X、Y、Z)的线性组合。本节将系统讲解XYZ空间、色度图、色域、白点与色温的核心概念及其在驱动开发中的实际意义。
2.1 CIE 1931 XYZ色彩空间
CIE 1931 XYZ色彩空间由国际照明委员会(CIE)于1931年基于三刺激值理论建立。它通过三个虚拟原色X、Y、Z来描述任何可见颜色,其中Y分量直接对应亮度(luminance),X和Z则编码色度信息。XYZ空间的数学定义来源于对2°视场标准观察者的颜色匹配实验数据。
| X | | 0.4124564 0.3575761 0.1804375 | | R_linear |
| Y | = | 0.2126729 0.7151522 0.0721750 | | G_linear |
| Z | | 0.0193339 0.1191920 0.9503041 | | B_linear |
注意:此转换要求RGB值已经过Gamma解压缩(线性化)。在DRM驱动中,CRTC的Gamma查找表(LUT)通常作用于线性RGB空间,因此理解此转换是正确配置色彩管理的前提。
XYZ空间的核心优势在于:
- 设备无关性: XYZ值直接对应人眼视觉响应,不依赖任何显示或采集设备。
- 线性可加性: 颜色混合满足格拉斯曼定律,即混合色的XYZ值等于各分量XYZ值之和。
- 亮度分离: Y分量独立表示亮度,便于进行亮度调整而不影响色度。
2.2 CIE 1931色度图
色度图(chromaticity diagram)是XYZ空间在二维平面上的投影,通过归一化坐标(x, y)表示颜色,忽略亮度信息。归一化公式为:
x = X / (X + Y + Z)
y = Y / (X + Y + Z)
z = Z / (X + Y + Z) = 1 - x - y
由于z可由x和y推导,通常只使用(x, y)坐标。色度图呈马蹄形,边界对应单色光谱色(380nm-780nm),内部区域为混合色。下图展示了CIE 1931色度图的基本结构:
2.3 色域(Color Gamut)
色域是指设备能够显示或记录的颜色范围。在色度图上,色域通常表示为连接三原色坐标的三角形区域。不同标准色域覆盖的可见颜色范围差异显著:
| 色域标准 | 红原色 (x, y) | 绿原色 (x, y) | 蓝原色 (x, y) | 白点 | 覆盖sRGB比例 |
|---|---|---|---|---|---|
| sRGB | (0.6400, 0.3300) | (0.3000, 0.6000) | (0.1500, 0.0600) | D65 | 100% |
| Adobe RGB | (0.6400, 0.3300) | (0.2100, 0.7100) | (0.1500, 0.0600) | D65 | ~152% |
| DCI-P3 | (0.6800, 0.3200) | (0.2650, 0.6900) | (0.1500, 0.0600) | D65或DCI白 | ~125% |
| BT.2020 | (0.7080, 0.2920) | (0.1700, 0.7970) | (0.1310, 0.0460) | D65 | ~157% |
在DRM CRTC驱动中,色域管理通常涉及以下步骤:
- 读取EDID: 从显示器的EDID数据中获取色度坐标和白点信息。
- 构建色域映射矩阵: 计算源色域到目标色域的3x3转换矩阵。
- 配置CTM: 将转换矩阵写入CRTC的Color Transformation Matrix硬件寄存器。
- Gamma校正: 通过LUT调整最终输出,补偿显示器的非线性响应。
2.4 白点(White Point)
白点定义了在特定色温下中性色(白色、灰色)的色度坐标。它是色彩管理中的绝对参考点,所有颜色都相对于白点进行定义。常见白点标准包括:
- D65: 色温6500K,坐标(0.3127, 0.3290),是sRGB、Adobe RGB、BT.2020的标准白点。
- D50: 色温5000K,坐标(0.3457, 0.3585),常用于印刷和摄影行业。
- DCI白点: 色温约5400K,坐标(0.3140, 0.3510),用于数字影院投影。
- CIE标准光源A: 色温2856K,坐标(0.4476, 0.4074),模拟白炽灯照明。
2.5 色温(Color Temperature)
色温用开尔文(K)表示,描述光源发出的光色。低色温(如3000K)偏暖黄,高色温(如9000K)偏冷蓝。色温与黑体辐射轨迹(Planckian locus)相关,在色度图上表现为一条从红橙到蓝白的曲线。
色温与白点坐标的近似转换公式(McCamy公式):
// 从色温计算D系列白点坐标
// T: 色温(开尔文),适用于4000K ~ 25000K
if (T <= 7000) {
x = -4.6070e9 / (T^3) + 2.9678e6 / (T^2) + 0.09911e3 / T + 0.244063;
} else {
x = -2.0064e9 / (T^3) + 1.9018e6 / (T^2) + 0.24748e3 / T + 0.237040;
}
y = -3.000 * x^2 + 2.870 * x - 0.275;
在DRM驱动中,色温调整通常通过以下方式实现:
- 硬件LUT: 在Gamma LUT中嵌入色温偏移曲线,调整RGB通道的增益比例。
- CTM矩阵: 通过3x3矩阵将当前白点映射到目标白点。
- 用户空间接口: 通过DRM property(如"CTM"、"GAMMA_LUT")暴露给用户态色彩管理服务。
2.6 色彩管理流程在DRM CRTC中的映射
将上述色彩科学概念映射到DRM CRTC驱动中,完整的色彩管理流水线如下:
// drm_crtc.h 中定义的色彩管理属性
struct drm_crtc {
// Gamma校正查找表(通常为256或1024项)
struct drm_property_blob *gamma_lut;
// 色彩转换矩阵(3x3,以9个u16或u32值表示)
struct drm_property_blob *ctm;
// 解Gamma查找表(用于线性化输入)
struct drm_property_blob *degamma_lut;
// 各LUT的精度和大小配置
uint32_t gamma_size;
uint32_t degamma_size;
};
用户空间通过libdrm或KMS API设置这些property,驱动负责将其写入硬件寄存器。硬件实现可能使用分段线性LUT、多项式逼近或查找表+插值等不同方式。