GL_FRAMEBUFFER_SRGB仅适用于前/后缓冲区
Does GL_FRAMEBUFFER_SRGB only work for Front/Back Buffer?
我正在尝试使用gl_framebuffer_srgb将srgb空间值写入framebuffer,但是我发现glenable的呼唤(gl_framebuffer_srgb)仅适用于前/背部缓冲区,并且不起作用,并且不起作用由纹理创建的框架缓冲器。
我的管道就是这样:
- 首先是场景阶段,将场景呈现到GL_RGB10_A2缓冲区;
- 然后是呈现到GL_RGB8(0x8051)缓冲区的后过程阶段,
- 后处理链最终呈现到前/后缓冲区。
我尝试在每个阶段做可亮(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对于我的案件而言,我脱颖而出:
- 检查
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
的值 - 该过程的一部分仅在启用混合时才发生。
OpenGL SRGB支持的主要目的是能够输出SRGB颜色并使它们在线性空间中正确混合。
我尝试了gl_rgb8,gl_rgba8和gl_srgb8_alpha8,而不是gl_srgb8,最后一个工作。
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 在 openGL 中多次绑定缓冲区
- 延迟渲染:使用默认framebuffer中Gbuffer的深度缓冲区
- 纹理和渲染缓冲区在framebuffer对象上共享相同的空间吗?