伽马校正(Gamma Correction)与sRGB
发布网友
发布时间:2024-10-28 21:23
我来回答
共1个回答
热心网友
时间:2024-10-28 21:31
过去的CRT显示器存在亮度与输入电压不成正比的物理特性,其亮度与输入电压的关系遵循约2.2次幂的规律。这一特性在人眼的视觉系统中得到了解释,因为人眼对亮度的感知具有非线性特征,对暗部细节的辨识能力相对较强。人眼的感知亮度与CRT显示器的显示亮度在数值上接近,且CRT显示器的伽马值(灰度系数)为2.2,这恰好满足了人眼的需求。
然而,这一非线性特性在显示设备的渲染过程中造成问题,因为渲染计算通常在理想线性空间中进行。例如,当输入一个暗红色的光照值(0.5, 0.0, 0.0)并期望将其亮度提升一倍变为(1.0, 0.0, 0.0)时,由于显示器的非线性特性,实际显示的颜色从(0.218, 0.0, 0.0)变化到(1.0, 0.0, 0.0)。为了解决这一问题,引入了伽马校正技术,通过在颜色输送到显示器之前进行逆伽马运算(pow0.454)来抵消显示器的作用。
伽马校正可通过图形API在硬件中执行,也可以在像素着色器最终输出之前自行执行。在执行伽马校正时,需要区分当前颜色是在伽马1.0的线性空间中还是在伽马2.2的sRGB空间中。例如,在执行两个pass时,第一个pass生成的中间结果在伽马1.0空间中,不应进行伽马校正;第二个pass生成的结果需要在sRGB空间中输出,因此在输出前应进行伽马校正。
sRGB颜色空间是由基于伽马2.2的显示器特性形成的,大多数游戏会将伽马值设置为2.2,并提供自定义设置选项以适应不同显示器。sRGB纹理在创建时通常已经在sRGB空间中,而伽马校正的目的是将纹理从sRGB空间转换为线性空间,以便在应用纹理后正确显示。
正确应用伽马校正和纹理重校时,需要考虑纹理的制作和使用颜色空间。例如,用于物体上色的diffuse贴图几乎都在sRGB空间中制作,而提供光照参数的法线贴图几乎都在线性空间中。如果将法线贴图配置为sRGB纹理,可能会导致渲染错误。
在光照计算中,我们通常使用亮度与距离的平方成反比的衰减公式。然而,在引入伽马校正之后,这种衰减与物理公式(与距离的平方成反比)更加接近,因此在实际应用中可以使用这种简化的方法。
通过直观的视觉实验,可以验证人眼视觉特性和显示器非线性特性之间的关系。例如,将图像分为黑线、白线和纯色色块的均匀混合部分,当从一定距离观察时,可以发现两侧表现出来的颜色与中间列下半部分显示的颜色较为接近。这一现象反映了人眼对亮度感知的非线性特征与显示器伽马值之间的相互作用。