我想将伽马校正应用到我的OpenGL照明中,但是应用伽马校正后,我的结果看起来一点也不线性。
我还发现了一个非常类似于我的问题的帖子: OpenGL: Gamma corrected image doesn't appear linear,但是它还没有得到答案,也没有讨论实际漫反射光。
为了说明问题,在线性空间中定义了以下4种光颜色:
不仅我几乎看不出伽马校正灯光的亮度差异,而且衰减也被伽马校正扭曲了。据我所知,所有计算(包括衰减)都是在线性空间中完成的,通过校正伽马,显示器应该正确地显示它(因为它会再次输出未校正的内容)。根据照明颜色,最右边的圆圈应该比左边的圆圈亮4倍,比第二个圆圈亮两倍,但实际上并非如此。
是我不够敏感无法感知到正确的亮度差异还是出了什么问题?
我尝试的另一件事情是将确切的光颜色输出到默认帧缓冲区,不带伽马校正和带伽马校正。
左侧是未校正的,右侧是带有伽马校正的;红色数字表示Photoshop颜色选择器中的RGB强度。我知道Photoshop RGB值不代表最终输出图像(因为Photoshop不会将RGB值读取为显示器输出)。左侧的图像直观上似乎更好,但基于RGB强度值,我认为右侧的图像确实通过我的片段着色器正确进行了伽马校正;因为每个强度都将通过显示器传递到我的眼睛中,具有正确的强度。例如,0.75强度经过0.88伽马校正后变为0.88 ^ 2.2 = 0.75作为显示器的输出。
右侧的图像是否确实正确?还有,为什么实际照明与其他图像相比如此不同?
我还发现了一个非常类似于我的问题的帖子: OpenGL: Gamma corrected image doesn't appear linear,但是它还没有得到答案,也没有讨论实际漫反射光。
为了说明问题,在线性空间中定义了以下4种光颜色:
glm::vec3 lightColors[] = {
glm::vec3(0.25),
glm::vec3(0.50),
glm::vec3(0.75),
glm::vec3(1.00)
};
将每个光源分离,并对漫反射光照方程应用基本的线性衰减,我得到了以下结果:
这是片段着色器:
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);
}
不仅我几乎看不出伽马校正灯光的亮度差异,而且衰减也被伽马校正扭曲了。据我所知,所有计算(包括衰减)都是在线性空间中完成的,通过校正伽马,显示器应该正确地显示它(因为它会再次输出未校正的内容)。根据照明颜色,最右边的圆圈应该比左边的圆圈亮4倍,比第二个圆圈亮两倍,但实际上并非如此。
是我不够敏感无法感知到正确的亮度差异还是出了什么问题?
我尝试的另一件事情是将确切的光颜色输出到默认帧缓冲区,不带伽马校正和带伽马校正。
左侧是未校正的,右侧是带有伽马校正的;红色数字表示Photoshop颜色选择器中的RGB强度。我知道Photoshop RGB值不代表最终输出图像(因为Photoshop不会将RGB值读取为显示器输出)。左侧的图像直观上似乎更好,但基于RGB强度值,我认为右侧的图像确实通过我的片段着色器正确进行了伽马校正;因为每个强度都将通过显示器传递到我的眼睛中,具有正确的强度。例如,0.75强度经过0.88伽马校正后变为0.88 ^ 2.2 = 0.75作为显示器的输出。
右侧的图像是否确实正确?还有,为什么实际照明与其他图像相比如此不同?