OpenGL允许通过使用GL_SRGB8_ALPHA8
将纹理声明为sRGB(通常是图像),这将导致OpenGL在GLSL中采样纹理时将sRGB颜色转换为线性RGB空间。这也称为" Gamma Correction"。
我还读到纹理中的线性插值与GL_SRGB8_ALPHA8
的行为不同,因为插值将在线性空间中发生。这有什么影响?这是否意味着应该始终使用GL_SRGB8_ALPHA8
作为纹理,而不是使用自己的sRGB - >通过GLSL线性转换?
答案 0 :(得分:3)
作为旁注,这就是OpenGL 4.5 core profile specification对此的评价(引用" 8.24 sRGB纹理颜色转换")
理想情况下,实施应该执行 在过滤之前对每个样本进行这种颜色转换 允许实现 过滤后执行此转换(尽管如此) 后过滤方法 不如在过滤之前从sRGB转换)。
因此规范不会保证你理想的行为。
答案 1 :(得分:1)
事实上,大多数图像都在sRGB空间中。如果您在将图像数据加载到OpenGL或着色器中时不进行任何特殊处理,同时渲染您将获得“错误”图像 - 您将对非线性数据应用线性计算。它看起来比渲染这样的图像时要暗。
但是,如果您转换为线性空间,您还应将最终渲染图像转换回sRGB空间,因为通常监视器应用了2.2伽玛曲线(与LCD屏幕之前的CRT输出兼容)。
因此,您可以在着色器中手动执行,也可以使用sRGB扩展,这些扩展同时提供纹理(从sRGB转换为线性)和帧缓冲区(自动从线性转换回sRGB)。要获得正确的图像,您应该同时应用两种转换。
启用伽马校正并正确执行可提供更自然,更柔和的图像。有关更详细的说明,请查看此文章https://learnopengl.com/#!Advanced-Lighting/Gamma-Correction