我想对我的OpenGL光源实现伽马校正,但是应用了伽马校正后,我的结果看起来根本不是线性的.
我还发现OpenGL:Gamma校正的图像看起来不是线性的,这与我的问题非常相似,但还没有得到答案,也没有讨论实际的漫射光.
作为一个例子,我在线性空间中定义了以下4种浅色:
glm::vec3 lightColors[] = {
glm::vec3(0.25),
glm::vec3(0.50),
glm::vec3(0.75),
glm::vec3(1.00)
};
Run Code Online (Sandbox Code Playgroud)
将每个光源分开,并将基本线性衰减应用于漫射照明方程式,得到以下结果:

这是片段着色器:
void main()
{
vec3 lighting = vec3(0.0);
for(int i = 0; i < 4; ++i)
lighting += Diffuse(normalize(fs_in.Normal), fs_in.FragPos, lightPositions[i], lightColors[i]);
// lighting = pow(lighting, vec3(1.0/2.2));
FragColor = vec4(lighting, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)
我不仅几乎看不到伽马校正灯的亮度差异,衰减也会因伽马校正而失真.就我的理解而言,所有计算(包括衰减)都是在线性空间中完成的,并且通过校正伽玛,监视器应该正确地显示它(因为它再次将其校正为输出).仅根据灯光颜色,最右边的圆圈应该是左圆圈的4倍,亮度是第二个圆圈的两倍,实际上并非如此.
只是因为我不够灵敏,无法察觉到正确的亮度差异或者是错误的吗?
我试过的其他东西只是将精确的光色输出到默认的帧缓冲区而没有和使用伽马校正.

左是未校正的,右边是伽马校正; 红色数字表示Photoshop的颜色选择器的RGB强度.我知道Photoshop RGB值不代表最终输出图像(因为Photoshop不会将RGB值读取为监视器输出).直觉上左图像似乎更好,但根据RGB强度值,我说最右边的图像确实是由我的片段着色器正确地进行了伽马校正; 因为这些强度中的每一个都会通过监视器并以正确的强度进入我的眼睛.例如,作为0.88伽马校正的0.75强度变为0.88 ^ 2.2 = 0.75作为监视器的输出.
正确的形象是否确实正确?而且,与其他图像相比,实际照明怎么样?