【问题标题】:OpenGL: Gamma corrected image doesn't appear linearOpenGL:伽马校正的图像看起来不是线性的
【发布时间】:2015-05-23 12:17:53
【问题描述】:

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

但这是我实际看到的;首先我没有进行伽马校正,然后进行伽马校正:

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

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 不幸的是,接受的答案非常令人困惑,我能够遵循的部分似乎是矛盾的,或者至少对于比回答者知识少的人没有完全解释。

【问题讨论】:

  • “在 Photoshop 中使用颜色选择器”它不能以这种方式工作。这是一个 monitor 伽玛,而不是帧缓冲区伽玛。如果将线性值写入 fb,ypu 将从 fb 读取线性值。您需要测量来自显示器的光线
  • @n.m.我的印象是颜色选择器值与帧缓冲区值不同。 (因此 Photoshop 会将图像存储在 sRGB 中,然后在颜色选择器中显示数字之前转换为线性 RGB)。我正在用我的眼睛测量来自我的显示器的光。我认为伽玛校正应该使颜色呈现线性。
  • “将图像存储在 sRGB 中”它从哪里获得 sRGB 来自
  • @n.m.这超出了我的理解。
  • 你不知何故把那个图像放到了 Photoshop 中。怎么样?

标签: c++ opengl glsl gamma srgb


【解决方案1】:

嗯,你的左右照片都符合预期。它们非常好,是的,我知道我的东西。

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

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

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

【讨论】:

猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多