【问题标题】:OpenGL sRGB framebuffer oddityOpenGL sRGB 帧缓冲异常
【发布时间】:2014-11-08 15:14:44
【问题描述】:

我正在使用 GLFW3 创建上下文,我注意到 GLFW_SRGB_CAPABLE 属性似乎没有任何效果。无论我将其设置为什么,当启用GL_FRAMEBUFFER_SRGB 时,我总是会进行 sRGB 转换。我的理解是,当启用GL_FRAMEBUFFER_SRGB 时,只有当帧缓冲区是 sRGB 格式时,您才能进行 sRGB 转换。更令人困惑的是,如果我检查GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING,无论我将GLFW_SRGB_CAPABLE 设置为什么,我都会得到GL_LINEAR。这似乎不是 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,不是吗?如果无论WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 设置为什么,它都在应用sRGB 校正,那么Nvidia 的驱动程序没有损坏吗?直到现在没人注意到这一点?

【问题讨论】:

    标签: opengl nvidia glfw


    【解决方案1】:

    这似乎只是默认帧缓冲区的问题,因此它一定是 Nvidia 的 WGL 实现中的错误。我已经向他们指出了这一点,因此希望它会得到修复。

    【讨论】:

    • 您好,您能详细说明一下吗?我也很感兴趣。您是如何得出这个结论的?
    【解决方案2】:

    使用 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/

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 2014-06-26
      • 2023-04-04
      • 1970-01-01
      • 2013-12-19
      • 2015-08-18
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多