我使用GLFW3创建上下文,但我注意到GLFW_SRGB_CAPABLE
属性似乎没有效果。无论我将其设置为什么,我都会在GL_FRAMEBUFFER_SRGB
启用时获得sRGB转换。我的理解是,当启用GL_FRAMEBUFFER_SRGB
时,仅当帧缓冲区是sRGB格式时才会获得sRGB转换。为了增加混淆,如果我检查GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
我得GL_LINEAR
,无论我将GLFW_SRGB_CAPABLE
设置为什么。这似乎不是GLFW的问题。我手动创建了一个窗口和上下文,并确保将GL_FRAMEBUFFER_SRGB_CAPABLE_ARB
设置为true。
我使用的是带有340.76驱动程序的Nvidia GTX 760。我正在检查这样的格式:
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_FRONT_LEFT, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &enc);
这应该返回GL_SRGB
,不是吗?如果它正在应用sRGB校正,无论WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB
设置为什么,那么Nvidia的驱动程序是否已被破坏?直到现在还没有人注意到这一点?
答案 0 :(得分:1)
这似乎只是默认帧缓冲区的问题,因此它必须是Nvidia的WGL实现中的一个错误。我已经向他们指出了,所以希望它能得到修复。
答案 1 :(得分:0)
使用GLX(Linux),我也遇到相同的行为。尽管它清楚地呈现为sRGB,但仍将报告线性。您可以使用texel值为1的sRGB纹理来验证它确实在工作,其中一种方法是将该纹理渲染到sRGB帧缓冲区中,并看到它显示出深灰色的正方形。 (作为比较,您可以看到当纹理不是sRGB纹理时-仍然是texel值为1时应该看起来更浅灰色的正方形)。
您可以看到以下示例:https://github.com/julienaubert/glsrgb
有趣的是,在OpenGL ES上下文中,(几乎)相同的代码无法正确呈现。
nvidia的开发人员OpenGL论坛上有一个主题:
https://devtalk.nvidia.com/default/topic/776591/opengl/gl_framebuffer_srgb-functions-incorrectly/