2009 年 8 月,苹果发布 Mac OS X 10.6 Snow Leopard 时,悄悄修改了一个很少人注意的默认设置:系统 Gamma 值从 1.8 改为 2.2。这个改动让无数设计师抱怨屏幕"突然变暗了"。但苹果并非心血来潮——这是向行业标准的靠拢。而这个被称为"Gamma"的参数,背后藏着一段横跨 80 年电视广播史的技术演化。

什么是 Gamma:一个看似简单的幂函数

Gamma 校正的本质是一个幂函数:

$$V_{\text{out}} = V_{\text{in}}^{\gamma}$$

当 γ > 1 时,曲线向下弯曲,输出值被"压缩";当 γ < 1 时,曲线向上弯曲,输出值被"扩展"。这个看似简单的数学变换,却是数字图像处理的基石之一。

但要真正理解 Gamma,得从它的起源说起——那个 CRT 显示器统治世界的年代。

CRT 的"意外"遗产

阴极射线管(CRT)显示器的工作原理决定了它天生就带有非线性特性。当电子枪发射电子束轰击屏幕上的荧光粉时,光强与输入电压的关系并非线性,而是近似遵循:

$$I \propto V^{\gamma}$$

其中 I 是光强,V 是输入电压,γ 大约在 2.2 到 2.5 之间。这意味着,如果输入电压是最大值的一半(0.5),实际显示的光强只有最大值的 0.5^2.2 ≈ 0.22,约 22%。这在当年是一个"意外"的物理特性,但这个意外却恰好与人眼的感知特性形成了微妙的互补。

Hewlett-Packard 的测试数据表明,不同品牌的 CRT 显示器平均 Gamma 值确实接近 2.2,这也是 sRGB 标准选择 2.2 作为参考值的重要依据。

人眼的非线性感知

人眼对亮度的感知是非线性的。这是生物学上的适应结果——让我们能在极宽的亮度范围内(约 10^6:1)辨别物体。韦伯-费希纳定律描述了这种现象:可感知的亮度变化与当前亮度的比例成正比

换句话说,在暗部区域,我们能分辨更细微的亮度差异;而在亮部区域,同样的绝对亮度变化几乎无法察觉。

Linear vs Nonlinear Brightness

图片来源: learnopengl.com

上图展示了两行灰度条。上面一行看起来亮度均匀递增——这正是人眼感知的"线性"。但下面一行才是物理意义上的线性亮度:在暗部跳变剧烈,在亮部几乎看不出差别。

这个差异揭示了一个关键洞察:如果用线性方式编码亮度,有限的位深会被大量浪费在亮部细节上,而暗部则因为精度不足出现断层

Gamma 编码:位深的优化分配

这正是 Gamma 编码的核心价值。通过对原始线性数据进行幂函数变换(γ ≈ 1/2.2 ≈ 0.45),可以把更多的码值分配给人眼敏感的暗部区域。

Gamma Encoded Gradient

图片来源: cdn.cambridgeincolour.com

上图展示了 Gamma 编码的效果。左侧是线性编码的渐变,右侧是 Gamma 编码后的效果。注意右侧在暗部区域的过渡更加平滑——因为在 Gamma 编码后,0-0.5 的输入值大约对应 0-0.73 的输出值,获得了更多的码值分配。

Cambridge in Colour 的分析指出,如果使用线性编码,需要 11 位(约 2048 级)才能避免暗部断层;而 Gamma 编码只需要 8 位(256 级)就能达到类似的视觉质量。这对于存储和传输都是巨大的节省。

从 CRT 到 LCD:Gamma 校正的传承

CRT 显示器有一个巧合:它的物理 Gamma(约 2.2)恰好能补偿摄像机端的 Gamma 编码(约 0.45),形成一个"闭环"。这意味着把 Gamma 编码后的图像直接送给 CRT 显示,结果会自动正确。

但 LCD 显示器没有这个物理特性。LCD 的光电响应在理论上更接近线性,或者说它的"原生 Gamma"与 CRT 完全不同。为了让 LCD 显示器兼容现有的 Gamma 编码内容,制造商在显示器内部加入了查找表(LUT),通过数字信号处理来模拟 CRT 的 Gamma 特性。

这就是为什么现代 LCD 显示器仍然在"假装"自己有 Gamma 2.2 的特性——这不是物理特性,而是对历史标准的兼容。

sRGB:分段 Gamma 曲线的工程智慧

1996 年,HP 和微软联合提出了 sRGB 色彩空间,后来被 IEC 标准化为 IEC 61966-2-1:1999。sRGB 并没有采用简单的幂函数,而是使用了一个分段函数:

编码端(线性 → sRGB):

$$ C' = \begin{cases} 12.92 C & \text{if } C \leq 0.0031308 \\ 1.055 C^{1/2.4} - 0.055 & \text{if } C > 0.0031308 \end{cases} $$

解码端(sRGB → 线性):

$$ C = \begin{cases} C' / 12.92 & \text{if } C' \leq 0.04045 \\ \left(\frac{C' + 0.055}{1.055}\right)^{2.4} & \text{if } C' > 0.04045 \end{cases} $$

为什么要在极低亮度处使用线性段?因为纯幂函数在零点的导数为无穷大,这会导致数值计算的不稳定性。线性段避免了这个问题,同时也让曲线在接近黑电平时更加可控。

sRGB Gamma Curve

图片来源: upload.wikimedia.org

图中红色曲线是 sRGB 的传输函数,黑色虚线是纯 Gamma 2.2 幂函数。可以看到两者非常接近,但在低亮度区域有细微差异。

Mac 的 Gamma 1.8:印刷时代的遗产

苹果在 Snow Leopard 之前一直使用 Gamma 1.8,这源于桌面排版时代的历史原因。早期的 LaserWriter 打印机的"网点扩大"(dot gain)特性与 Gamma 1.8 曲线相近。在色彩管理系统尚不完善的年代,让显示器和打印机使用相似的 Gamma 值可以简化工作流——屏幕上看到的效果更接近最终打印结果。

但随着色彩管理的成熟和 sRGB 标准的普及,Gamma 1.8 的优势不再存在,反而造成了与其他平台的内容不兼容。2009 年,苹果终于顺应潮流,将默认 Gamma 改为 2.2。

Gamma 2.2 vs 2.4:环境光的考量

Windows 默认 Gamma 2.2,而电视广播标准(如 Rec. 709)常使用 Gamma 2.4。差异的根源在于观看环境。

Gamma 2.2 适用于"较暗的办公室环境"——有一定环境光,但不算明亮。而 Gamma 2.4(或 BT.1886 标准)适用于"暗室环境"——典型的家庭影院场景。在暗室中,人眼对暗部细节更敏感,稍高的 Gamma 值能让暗部层次更丰富。

BT.1886 标准甚至更进一步,它不是固定 Gamma,而是根据显示器的实际黑电平动态调整曲线:

$$L = L_W \left( \frac{V^{2.4} - V_B^{2.4}}{1 - V_B^{2.4}} \right)$$

其中 L_W 是白电平(通常 100 cd/m²),V_B 是归一化的黑电平。这种设计让 BT.1886 能够适应不同对比度能力的显示器。

DCI-P3 影院标准更进一步,使用 Gamma 2.6——因为电影院是完全黑暗的环境,且数字投影仪的黑电平远低于家用显示器。

线性工作流:渲染的正确姿势

在 3D 渲染和图像处理中,Gamma 校正错误是常见的陷阱。问题出在:大多数纹理图像都是 Gamma 编码的(sRGB),但如果在 Shader 中直接使用这些值进行光照计算,结果会是错的。

物理世界的光照遵循线性叠加——两盏灯的亮度等于各自亮度的和。但 Gamma 编码的空间不满足这个性质。如果用 Gamma 编码的值做光照计算,实际上是在做:

$$(0.5^{2.2} + 0.5^{2.2})^{1/2.2} \approx 0.73$$

而正确的线性计算应该是:

$$(0.5 + 0.5) = 1.0$$

这意味着,未经 Gamma 校正的渲染会系统性地让光照变暗、对比度降低。

Gamma Correction Example

图片来源: learnopengl.com

上图对比了正确 Gamma 校正(左)和未校正(右)的渲染结果。可以看到校正后的图像暗部细节更丰富,整体光照更自然。

正确的线性工作流流程:

  1. 读取 sRGB 纹理时,自动转换为线性空间(GPU 通常通过 GL_SRGB 格式自动完成)
  2. 在线性空间进行所有光照和混合计算
  3. 最终输出时,将结果转换回 Gamma 编码空间

现代游戏引擎和渲染框架(如 Unity、Unreal Engine)都提供了线性空间渲染选项,本质上就是自动处理这个流程。

HDR 时代:从 Gamma 到 PQ

随着 HDR 显示技术的普及,传统的 Gamma 曲线面临新的挑战。HDR 内容需要表达高达 10000 nits 的亮度范围,而传统 8-bit Gamma 编码在这个范围内精度严重不足。

SMPTE ST 2084(也称 PQ,Perceptual Quantizer)应运而生。PQ 曲线基于人眼的对比度敏感度模型,能够高效地将 0.0001 到 10000 nits 的亮度范围编码到 10-12 bit:

$$V = \left( \frac{c_1 + c_2 \cdot L^{m_1}}{1 + c_3 \cdot L^{m_1}} \right)^{m_2}$$

其中 L 是归一化的亮度值,c_1、c_2、c_3、m_1、m_2 是预定义的常数。

PQ 曲线与 Gamma 的本质区别在于:Gamma 是简单的幂函数,而 PQ 是基于 Barten 视觉模型设计的感知均匀编码。在 100 nits 以下,PQ 近似于 Gamma 2.4;在更高亮度区域,曲线变得更加陡峭以容纳更大的动态范围。

HLG(Hybrid Log-Gamma)则采取了不同的策略:它保留了对传统 SDR 设备的兼容性,同时通过曲线形状的变化来支持 HDR。HLG 在低亮度区域类似 Gamma 曲线,在高亮度区域则采用对数曲线。

色带问题:Gamma 校正的副作用

Gamma 校正并非没有代价。在 8-bit 环境下,对 Gamma 编码的图像进行调整(如曲线、色阶)后再转回 Gamma 空间,往往会产生色带——暗部的平滑过渡被量化台阶取代。

这是因为 Gamma 编码虽然优化了存储效率,但牺牲了计算的精度。在非线性空间进行插值和混合会产生数学上不正确的结果,而这种误差在多次处理后会累积放大。

解决方案包括:

  • 使用更高位深(10-bit 或 16-bit)进行处理
  • 在线性空间进行所有计算,仅在最后一步转回 Gamma 编码
  • 在 8-bit 输出前添加适当的抖动

为什么 Gamma 仍然重要

在 CRT 显示器早已成为历史的今天,Gamma 校正依然不可或缺,原因有三:

存储效率:对于有限的位深(如 8-bit),Gamma 编码依然是最有效的方式,将宝贵的码值分配给人眼最敏感的暗部区域。

兼容性:几乎所有的图像格式(JPEG、PNG)、视频编码(H.264、HEVC)和显示设备都基于 Gamma 编码的标准(sRGB、Rec.709)。

感知均匀性:Gamma 编码后的数值变化与人眼感知的亮度变化更加一致,这使得图像处理算法(如直方图均衡化)在 Gamma 空间更加直观有效。

Gamma 校正从 CRT 的物理特性出发,最终成为数字图像处理的基石。它是一个工程师们"因祸得福"的案例——物理上的不完美恰好匹配了人类感知的非线性,而这个巧合被标准化、传承,并在 LCD 和 OLED 时代继续发挥作用。理解 Gamma,就是理解数字图像如何从物理世界映射到我们的感知世界。


参考文献

  1. International Electrotechnical Commission. IEC 61966-2-1:1999 - Multimedia systems and equipment - Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB. 1999.

  2. ITU-R Recommendation BT.1886 - Reference electro-optical transfer function for flat panel displays used in HDTV studio production. 2011.

  3. ITU-R Recommendation BT.709-6 - Parameter values for the HDTV standards for production and international programme exchange. 2015.

  4. SMPTE ST 2084:2014 - High Dynamic Range Electro-Optical Transfer Function of Mastering Reference Displays.

  5. Poynton, Charles. “Gamma and Its Disguises.” Journal of the Society of Motion Picture and Television Engineers, 1993.

  6. Ebner, Fritz, and Mark D. Fairchild. “Development and testing of a color space (IPT) with improved hue uniformity.” IS&T/SID Sixth Color Imaging Conference, 1998.

  7. Wikipedia contributors. “Gamma correction.” Wikipedia, The Free Encyclopedia.

  8. Cambridge in Colour. “Understanding Gamma Correction.” https://www.cambridgeincolour.com/tutorials/gamma-correction.htm

  9. LearnOpenGL. “Gamma Correction.” https://learnopengl.com/Advanced-Lighting/Gamma-Correction

  10. Apple Inc. “Mac OS X v10.6 Snow Leopard: About gamma 2.2.” Technical Note TN2263, 2009.

  11. Barten, Peter G. J. “Contrast sensitivity of the human eye and its effects on image quality.” SPIE Press, 1999.

  12. Reinhard, Erik, et al. “High Dynamic Range Imaging: Acquisition, Display, and Image-Based Lighting.” Morgan Kaufmann, 2010.

  13. Colour Science. “sRGB EOTF: Pure Gamma 2.2 or Piece-Wise Function?” https://www.colour-science.org/posts/srgb-eotf-pure-gamma-22-or-piece-wise-function/

  14. Light Illusion. “What is HDR?” https://lightillusion.com/what_is_hdr.html

  15. EIZO. “Understanding Monitor Gamma & Gamma Correction.” https://www.eizo.com/library/basics/lcd_display_gamma/