GL_FRAMEBUFFER_SRGB仅适用于前/后缓冲区

Does GL_FRAMEBUFFER_SRGB only work for Front/Back Buffer?

本文关键字:缓冲区 FRAMEBUFFER SRGB GL 适用于      更新时间:2023-10-16

我正在尝试使用gl_framebuffer_srgb将srgb空间值写入framebuffer,但是我发现glenable的呼唤(gl_framebuffer_srgb)仅适用于前/背部缓冲区,并且不起作用,并且不起作用由纹理创建的框架缓冲器。

我的管道就是这样:

  1. 首先是场景阶段,将场景呈现到GL_RGB10_A2缓冲区;
  2. 然后是呈现到GL_RGB8(0x8051)缓冲区的后过程阶段,
  3. 后处理链最终呈现到前/后缓冲区。

我尝试在每个阶段做可亮(gl_framebuffer_srgb)。由于所有渲染缓冲液都不是SRGB格式,因此下一个阶段不会自动对线性转换进行任何SRGB,并且我也不在着色器中进行任何转换,我应该期望最终结果变得非常明亮,因为多个线性 - to-sRGB转换。但这仅适用于呈现前/后缓冲区的最后阶段,因此最终结果不会变得非常明亮。

我尝试了渲染缓冲液的更多格式(gl_rgb8,gl_rgba8,gl_srgb8_alpha8),仍然不起作用。

我错过了规格中的东西吗?将GTX750与Win7上的最新驱动程序一起使用。

首先是openGL 4.6核心配置文件说的说法(强调矿山):

第17.3.6.1节混合方程

如果启用了FrameBuffer_srgb,并且FrameBuffer_attachment_color_encoding的framebuffer附件的值与目标缓冲区相对应的是SRGB(请参阅第9.2.3节), r,g,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的framebuffer附件的值与目标缓冲区相对应的是SRGB(请参阅第9.2.3节)(请参阅第9.2.3节),将混合后的r,g和b值转换为非线性SRGB 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颜色值。

2对于我的案件而言,我脱颖而出:

  1. 检查GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING的值
  2. 该过程的一部分仅在启用混合时才发生。

OpenGL SRGB支持的主要目的是能够输出SRGB颜色并使它们在线性空间中正确混合。

我尝试了gl_rgb8,gl_rgba8和gl_srgb8_alpha8,而不是gl_srgb8,最后一个工作。