我正在使用 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;
}
这是添加了伽玛校正的着色器(从线性空间到 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 没有在线性空间中选择颜色?还是我的“非线性”图像实际上是正确的线性结果,但在我看来它似乎不是线性的?
我的问题与此类似:我是否需要对现代计算机/显示器上的最终颜色输出进行伽玛校正? 不幸的是,接受的答案非常令人困惑,我能够遵循的部分似乎是矛盾的,或者至少不是为比回答者知识渊博的人进行了充分解释。