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°视场标准观察者的颜色匹配实验数据。

关键公式: 从RGB到XYZ的线性转换矩阵(以sRGB为例)
| 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色度图的基本结构:

CIE 1931色度图结构 520nm 550nm 580nm 600nm 650nm 700nm 480nm D65 R G B 色度图关键点 • 马蹄形边界:单色光谱 • 内部区域:混合色 • 白点:中性色参考 x y
驱动开发提示: 色度图是评估显示设备色彩还原能力的核心工具。在DRM驱动中,通过配置CRTC的Gamma LUT和CTM(Color Transformation Matrix),可以调整显示器的色域映射和白点校正。色度图上的三角形区域代表设备色域,其顶点对应红、绿、蓝三原色的(x, y)坐标。

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驱动中,色域管理通常涉及以下步骤:

  1. 读取EDID: 从显示器的EDID数据中获取色度坐标和白点信息。
  2. 构建色域映射矩阵: 计算源色域到目标色域的3x3转换矩阵。
  3. 配置CTM: 将转换矩阵写入CRTC的Color Transformation Matrix硬件寄存器。
  4. 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),模拟白炽灯照明。
驱动配置警告: 白点不匹配是色彩偏差的常见原因。如果显示器的EDID报告的白点与CRTC配置的白点不一致,会导致整体色偏。在DRM驱动中,应优先使用EDID中的白点信息,并通过CTM进行白点校正。错误的D65配置在D50显示器上会导致图像偏蓝。

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")暴露给用户态色彩管理服务。
色温与黑体辐射轨迹 2000K 4000K 6500K (D65) 10000K 15000K 白炽灯 ~2800K 日光 ~5500K 阴天 ~6500K 色温在DRM驱动中的应用 • 低色温(暖):增加R通道增益,减少B通道增益 • 高色温(冷):减少R通道增益,增加B通道增益 • 实现方式:通过Gamma LUT或CTM矩阵调整RGB比例

2.6 色彩管理流程在DRM CRTC中的映射

将上述色彩科学概念映射到DRM CRTC驱动中,完整的色彩管理流水线如下:

DRM CRTC色彩管理流水线 帧缓冲 sRGB / BT.2020 解Gamma 线性化RGB CTM 色域/白点映射 Gamma LUT 非线性校正 色彩管理流水线说明 1. 帧缓冲输入 • 像素数据以编码格式存储(如sRGB、BT.2020) • 包含源色域和白点信息(由用户空间指定) 2. 解Gamma(线性化) • 应用逆Gamma曲线,将编码值转为线性光强 • 确保后续矩阵运算在感知均匀的线性空间进行 3. CTM(色域/白点映射) • 3x3矩阵:将源XYZ转换到目标XYZ • 实现色域裁剪、白点校正、色温调整 • 在DRM中通过"CTM" property配置 4. Gamma LUT(非线性校正) • 应用显示设备的Gamma响应曲线 • 补偿CRT/LCD/OLED的非线性特性 • 在DRM中通过"GAMMA_LUT" property配置 5. 输出到显示器 • 最终像素值经过DAC或DP/eDP/HDMI发送 • 硬件自动完成数字到模拟转换
驱动实现要点: 在DRM CRTC驱动中,色彩管理配置通过以下property暴露给用户空间:
// 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、多项式逼近或查找表+插值等不同方式。

2.7 本章小结