2017-04-10 27 views
2

的OpenGL允许一个通过使用GL_SRGB8_ALPHA8,这将导致的OpenGL到sRGB颜色转换为线性RGB空间采样在GLSL纹理时声明一个纹理在被的sRGB(如图像通常是)。这也被称为“伽马校正”。GL_SRGB8_ALPHA8对纹理插值的影响?

我也看到了,在纹理的线性插值将不同的表现与GL_SRGB8_ALPHA8插值将在所谓线性空间藏汉发生。这有什么影响,如果有的话?这是否意味着应该始终使用GL_SRGB8_ALPHA8作为纹理,而不是通过GLSL执行自己的sRGB - >线性转换?

回答

3

作为边注,这是什么OpenGL 4.5 core profile specification具有说这个(从节“8.24 sRGB的纹理色彩转换”引述):

理想的是,实施方式中应当执行 对每个样品此颜色转换在过滤之前,但 实现允许 滤波(尽管这 后滤波方法 不如从sRGB的滤波之前转换)之后执行这种转换。

所以规范将不能保证您理想的行为。

1

事实上,大部分的图像是在sRGB空间。如果在渲染时将图像数据加载到OpenGL或着色器中时没有执行任何特殊处理,则会得到“错误”图像 - 您将对非线性数据应用线性计算。当您渲染这样的图像时,它看起来比它应该更黑。因为通常情况下,监视器应用了2.2条伽马曲线(与LCD屏幕之前的CRT输出兼容)。但是,如果要转换为线性空间,则还应将最终渲染图像转换回sRGB空间。因此,您可以在着色器中手动执行此操作,也可以使用sRGB扩展(提供用于纹理(从sRGB转换为线性)和帧缓冲区(自动从线性转换回sRGB)的扩展。要获得正确的图像,您应该同时应用这两种转换。

启用伽马校正并正确操作会得到更自然,更柔和的图像。看看这篇文章https://learnopengl.com/#!Advanced-Lighting/Gamma-Correction了解更多详细说明