OpenGL:伽马校正后的图像不呈线性状态

5
我正在使用OpenGL进行渲染,当我将线性值写入默认帧缓冲区时(没有任何伽马校正),它们在我的显示器上呈线性状。这与我所知道的伽马校正的一切相违背(如此处所述:http://gamedevelopment.tutsplus.com/articles/gamma-correction-and-why-it-matters--gamedev-14466)。如果没有伽马校正,我会预期看到中间范围的颜色在我的显示器上被非线性地变暗。

但是这就是我实际上看到的;首先没有我的伽马校正,然后再有伽马校正: enter image description here

下面是我的片段着色器(没有进行伽马校正)在默认帧缓冲区上的全屏四边形绘制结果,如图左侧所示:

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;
}

这是添加了伽马校正(从线性空间到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;
}

我正在通过观察颜色以及使用Photoshop的取色器并查看颜色带之间RGB值的差异来验证颜色是否为线性。对于看起来是线性的图像,每种颜色之间的差异(大多数情况下)是恒定的。我还尝试请求一个支持sRGB的默认帧缓冲区。在这种情况下,不进行伽马校正的线性值看起来像第二张图像(非线性)。我做错了什么?或者我的两个显示器都没有校准好,并且Photoshop没有在线性空间中选择颜色吗?或者我的“非线性”图像实际上是正确的线性结果,只是在我的眼中看起来不是线性的?我的问题有点类似于这个: Do I need to gamma correct the final color output on a modern computer/monitor,但不幸的是,被接受的答案非常令人困惑,我能理解的部分似乎相互矛盾,或者至少没有完全解释给比答复者知识水平低的人。

2
使用Photoshop中的颜色选择器,这样行不通。这是显示器伽马,而不是帧缓冲伽马。如果您将线性值写入fb,则将从fb读取线性值。您需要测量来自显示器的光线 - n. m.
@n.m. 我的理解是颜色选择器的值与帧缓冲区的值不同。(因此,Photoshop会将图像存储在sRGB中,然后在显示颜色选择器中的数字之前转换为线性RGB)。而我正在用我的眼睛测量从我的显示器发出的光。我认为伽马校正应该使颜色呈现线性。 - KTC
“将图像存储在sRGB中”,它从哪里获取sRGB呢? - n. m.
@n.m. 那超出了我的理解范围。 - KTC
你不知道怎么把那张图片导入到Photoshop里的。怎么办? - n. m.
1个回答

1

好的,你左右两张图片都是预期的一样。它们非常不错,是的,我知道这方面的东西。

只是我们的眼睛也不是很线性的,所以例如线性强度(光强度)的1/5被感知为“比白色暗一半”。这是你在右边看到的,在校正后的图像中,靠近底部。

这就是伽马首先存在的原因 - 通过模仿眼睛的反应来帮助编码。换句话说,伽马使非线性斜坡看起来线性。

然而,一个物理线性的斜坡(如右侧)因此很难被感知为线性。记住,真实世界有相当大的动态范围(以光强度为单位),而我们的眼睛正在补偿这一点。这使你感到困惑,但与许多其他人不同,你确实得到了正确的数字。


这更或多或少是一个副本:https://dev59.com/IYrda4cB1Zd3GeqPGwV-?lq=1 - Simon Thum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接