【发布时间】:2016-02-08 11:31:18
【问题描述】:
我有一个小样本,es-300-fbo-srgb,应该展示如何在 opengl es3 中管理伽马校正。
基本上我有:
-
GL_SRGB8_ALPHA8纹理TEXTURE_DIFFUSE - 在
GL_COLOR_ATTACHMENT0上带有另一个GL_SRGB8_ALPHA8纹理和在GL_DEPTH_ATTACHMENT上带有GL_DEPTH_COMPONENT24纹理的帧缓冲区 - 我的默认 fbo 的后台缓冲区是
GL_LINEAR -
GL_FRAMEBUFFER_SRGB最初禁用。
现在,如果我回顾一下 display 方法,这就是我要做的:
我在 sRGB fbo 上渲染
TEXTURE_DIFFUSE纹理,由于源纹理在 sRGB 空间中,我的片段着色器将自动读取线性值并将其写入 fbo。 Fbo 现在应该包含线性值,虽然它是 sRGB,因为GL_FRAMEBUFFER_SRGB被禁用,所以没有执行线性->sRGB 转换。我将 fbo 的内容 blit 到默认的 fbo 后台缓冲区(通过程序)。但是由于这个 fbo 的纹理具有 sRGB 分量,所以在读取的值上会执行错误的 gamma 操作,因为它们被假定在 sRGB 空间中,而实际上它们不是。
我的显示器在渲染默认 fbo 的内容时会执行第二次 gamma 操作
所以我的形象是,如果我是对的,那就是错误的两倍..
现在,如果我 glEnable(GL_FRAMEBUFFER_SRGB); 我得到的是
图像看起来好像已经过多次 sRGB 校正..
如果我改为禁用 GL_FRAMEBUFFER_SRGB 并更改我的 fbo 的 GL_COLOR_ATTACHMENT0 纹理的格式,我最终会得到正确的图像..
为什么我无法使用glEnable(GL_FRAMEBUFFER_SRGB); 获得正确的图像?
【问题讨论】:
-
你介意给我一个简单的例子来用openGL进行伽马校正吗?我在互联网上找不到任何东西:((
-
当然,here 你去