我尝试使用GL_FRAMEBUFFER_SRGB将sRGB空间值写入帧缓冲区,但我发现glEnable(GL_FRAMEBUFFER_SRGB)的调用仅适用于Front / Back缓冲区,而不适用于从纹理创建的其他帧缓冲区。 / p>
我的管道是这样的:
我尝试为每个阶段做glEnable(GL_FRAMEBUFFER_SRGB)。由于所有渲染缓冲区都不是sRGB格式,因此下一阶段不会自动执行任何sRGB到线性转换,并且我也没有在着色器中进行任何转换,我应该期望最终结果变得非常明亮因为多个线性到sRGB转换。但它只适用于渲染到Front / Back缓冲区的最后一个阶段,因此最终结果不会非常明亮。
我为渲染缓冲区(GL_RGB8,GL_RGBA8,GL_SRGB8_ALPHA8)尝试了更多格式,仍然无效。
我是否遗漏了规格中的内容?使用GTX750和win7上的最新驱动程序。
答案 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颜色值。
与您的案件有关的两件事情突出:
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
OpenGL的sRGB支持的主要目的是能够输出sRGB颜色并使它们在线性空间中正确混合。
答案 1 :(得分:0)
我尝试了GL_RGB8,GL_RGBA8和GL_SRGB8_ALPHA8,但没有使用GL_SRGB8,最后一个工作了。