admin 管理员组

文章数量: 1184232

Gamma

设一个颜色的值为q(x∈[0,1]),设显示器展示出来的亮度值为w,设人眼看到的亮度值为e。

当显示器设备的gamma为2.2时,则w=q ^ 2.2
人眼相当于二次幂,即人眼看到的颜色亮度为e=q ^ 2。因此CRT这个缺陷正好能满足人的需要,即CRT上展示的颜色亮度,就为人眼中应该看到的颜色。
但有一个问题是:当我们对颜色值做变换的时候,在我们人眼中的颜色会发生意想不到的改变:
比如,光的颜色向量L=(0.5,0.0,0.0)代表的是暗红色。如果我们在线性空间中把它翻倍,就会变成(1.0,0.0,0.0),就像你在图中看到的那样。然而,由于我们定义的颜色仍然需要输出的监视器上,监视器上显示的实际颜色就会是(0.218,0.0,0.0)。在这儿问题就出现了:当我们将理想中直线上的那个暗红色翻一倍时,在监视器上实际上亮度翻了4.5倍以上!

知识点

启用OpenGL自带sRGB矫正:

glEnable(GL_FRAMEBUFFER_SRGB);

自定义gamma矫正:

voidmain(){// do super fancy lighting [...]// apply gamma correctionfloat gamma =2.2;
    fragColor.rgb =pow(fragColor.rgb,vec3(1.0/gamma));}

颜色值的重矫:

float gamma =2.2;
vec3 diffuseColor =pow(texture(diffuse, texCoords).rgb,vec3(gamma));

读取sRGB纹理:

glTexImage2D(GL_TEXTURE_2D,0, GL_SRGB, width, height,0, GL_RGB, GL_UNSIGNED_BYTE, image);

衰减

float attenuation =1.0/ distance;

本文标签: 到的颜色 监视器上 矫正