OpenGL sRGB framebuffer奇怪

时间:2014-09-15 06:42:49

标签: opengl nvidia glfw

我使用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的驱动程序是否已被破坏?直到现在还没有人注意到这一点?

2 个答案:

答案 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/