GL_FRAMEBUFFER_SRGB仅适用于前/后缓冲区吗?

时间:2017-11-29 14:03:02

标签: c++ opengl

我尝试使用GL_FRAMEBUFFER_SRGB将sRGB空间值写入帧缓冲区,但我发现glEnable(GL_FRAMEBUFFER_SRGB)的调用仅适用于Front / Back缓冲区,而不适用于从纹理创建的其他帧缓冲区。 / p>

我的管道是这样的:

  1. 首先是将场景渲染到GL_RGB10_A2缓冲区的场景阶段;
  2. 然后是渲染到GL_RGB8(0x8051)缓冲区的后处理阶段,
  3. 最终呈现为Front / Back缓冲区的后处理链。
  4. 我尝试为每个阶段做glEnable(GL_FRAMEBUFFER_SRGB)。由于所有渲染缓冲区都不是sRGB格式,因此下一阶段不会自动执行任何sRGB到线性转换,并且我也没有在着色器中进行任何转换,我应该期望最终结果变得非常明亮因为多个线性到sRGB转换。但它只适用于渲染到Front / Back缓冲区的最后一个阶段,因此最终结果不会非常明亮。

    我为渲染缓冲区(GL_RGB8,GL_RGBA8,GL_SRGB8_ALPHA8)尝试了更多格式,仍然无效。

    我是否遗漏了规格中的内容?使用GTX750和win7上的最新驱动程序。

2 个答案:

答案 0 :(得分:1)

首先OpenGL 4.6 Core Profile规范说明(强调我的):

  

第17.3.6.1节混合方程

     

如果FRAMEBUFFER_SRGB已启用且与目标缓冲区对应的帧缓冲附件的FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING值为SRGB(请参阅第9.2.3节),则 R,G和B目标颜色值(从固定转换后)指向浮点数被认为是为sRGB颜色空间编码,因此必须在它们用于混合之前进行线性化。每个R,G和B组件的转换方式与8.24节中针对sRGB纹理组件描述的方式相同。

     

如果禁用FRAMEBUFFER_SRGB或FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING的值不是SRGB,则不执行线性化。

     

将得到的线性化的R,G和B以及未修改的A值重新组合为混合计算中使用的目标颜色。表17.1提供了相应的每个组件

     

17.3.7 sRGB转换(在混合后发生)

     

如果启用FRAMEBUFFER_SRGB并且对应于目标缓冲区的帧缓冲附件的FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING值为SRGB(请参阅第9.2.3节),则混合后的R,G和B值将转换为非线性sRGB颜色通过计算[cs = sRGB(cl)]来计算空间,其中cl是R,G或B元素,cs是结果(有效地转换为sRGB颜色空间)。

     

如果禁用FRAMEBUFFER_SRGB或FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING的值不是SRGB,则cs = cl 。生成的R,G和B的cs值以及未修改的A形成新的RGBA颜色值。

与您的案件有关的两件事情突出:

  1. 检查GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
  2. 的值
  3. 只有启用了混合才会发生部分过程。
  4. OpenGL的sRGB支持的主要目的是能够输出sRGB颜色并使它们在线性空间中正确混合。

答案 1 :(得分:0)

我尝试了GL_RGB8,GL_RGBA8和GL_SRGB8_ALPHA8,但没有使用GL_SRGB8,最后一个工作了。