写在前面
由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们加以处理。本节将熟悉Gamma校正的概念,并通过点光源的示例来表现Gamma校正对图形效果的影响。本节示例代码均可以在我的github下载。
为什么需要 γ 校正
我们在图形程序中认为(1.0, 0.0,0.0)颜色应该是(0.5,0.0, 0.0)的红色强度的2倍,但是实际上在显示设备上对于输入的原始值,并不按照线性的关系来反映这个亮度差别。显示设备对于输入的原始值,按照一种非线性的方式处理,也就是说上面原始值中红色分量提高2倍时,实际处理时得到的亮度并不是成这种2倍的比例。
事实上,CRT、LED这类显示设备,对于输入的原始值,会计算一个指数函数,即: Cout=C2.2in 。这里的2.2称为 伽马系数(Gamma factor),范围一般在2.0到2.4之间,不同显示器这个系数有区别。这个关系如下图所示(来自Gamma Correction):
上面的图中间的点线,是我们图形中工作的线性颜色,当显示器接受这个线性原始值后,进行了上面的指数计算,将会输出图中下方的实线所示的非线性的颜色,亮度会降低。对于0。0和1.0两个值显示器总是原样输出,两个值之间的颜色亮度将会降低。
因此,要想最终显示器按照我们预期的输出中间的线性颜色,我们就需要执行上述指数运算的逆运算: Ccorrected=C