OpenGL:Gamma校正图像看起来不是线性的

KTC*_*KTC 5 c++ opengl gamma glsl srgb

我正在使用OpenGL进行渲染,当我将线性值写入默认帧缓冲区(没有任何伽马校正)时,它们在我的监视器上显示为线性.这违背了我认为我对伽马校正的所有知识(如下所述:http://gamedevelopment.tutsplus.com/articles/gamma-correction-and-why-it-matters--gamedev-14466).如果没有伽马校正,我希望我的显示器可以看到中距离颜色非线性变暗.

但这是我实际看到的; 我首先没有伽马校正,然后进行伽马校正: 在此输入图像描述

这是我的片段着色器,没有伽马校正(在全屏四边形上绘制到默认的帧缓冲区).这导致左侧的线性图像:

out vec4 fsOut0;

void main( void )
{
    // split the screen into 10 discrete color bands
    float yResolution = 768.0;
    int intVal = int(gl_FragCoord.y / yResolution * 10.0);
    fsOut0.rgb = vec3( float(intVal) / 10.0 );

    fsOut0.a = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

这里是添加了伽马校正的着色器(从线性空间到sRGB).这导致右侧的图像比线性更明亮:

out vec4 fsOut0;

void main( void )
{
    // split the screen into 10 discrete color bands
    float yResolution = 768.0;
    int intVal = int(gl_FragCoord.y / yResolution * 10.0);
    fsOut0.rgb = vec3( float(intVal) / 10.0 );

    // gamma correction
    fsOut0.rgb = pow( fsOut0.rgb, vec3(1.0/2.2) );

    fsOut0.a = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

我只是通过查看它们来验证颜色是否是线性的,并在Photoshop中使用颜色选择器并查看颜色带之间RGB值的差异.对于线性外观图像,每种颜色之间的差异(大部分)是恒定的.

我也尝试过请求一个支持sRGB的默认帧缓冲区.在这种情况下,写入没有伽马校正的线性值看起来像第二个图像(非线性).

我究竟做错了什么?或者可能是我的两个显示器都被错误校准并且Photoshop不会在线性空间中选择颜色?或者我的"非线性"图像实际上是正确的线性结果,但它对我的眼睛来说似乎不是线性的?

我的问题有点像这样:我需要对现代计算机/显示器上的最终颜色输出进行伽马校正吗 不幸的是,接受的答案非常令人困惑,我能够遵循的部分似乎是矛盾的,或者至少不是完全解释了比回答者知之甚少的人.

Sim*_*hum 1

好吧,你的左图和右图都符合预期。他们都很好,是的,我知道我的东西。

只是我们的眼睛也不是很线性,所以例如线性强度(发光强度)的 1/5 被感知为“亮度只有白色的一半”。这就是您在右侧、靠近底部的校正图像中看到的内容。

这就是伽玛存在的首要原因——通过模仿眼睛的反应来帮助编码。IOW,伽玛使非线性斜坡看起来是线性的。

然而,物理上的线性斜坡(如右图)因此与被认为是线性的完全相反。请记住,现实世界具有相当大的动态范围(就发光强度而言),我们的眼睛正在对此进行补偿。这让您感到困惑,但与其他许多人不同的是,您实际上得到了正确的数字。