【问题标题】:Small sample in opengl es 3, wrong gamma correctionopengl es 3中的小样本,错误的伽马校正
【发布时间】: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 你去

标签: opengl-es jogl srgb


【解决方案1】:

我认为您基本上是对的:您获得了两次解码转换的净效果,其中一次(显示器中的一次)就足够了。我想您的驱动程序或您的代码破坏了某些东西,因此 OpenGL 不能正确地“连接点”;也许这个答案可以帮助你:

When to call glEnable(GL_FRAMEBUFFER_SRGB)?

【讨论】:

  • 默认fbo默认为GL_LINEAR。同时,我通过在first passage 启用GL_FRAMEBUFFER_SRGB 并在second one 禁用它来解决它,但我无法解释它为什么起作用..
  • 现在可以了!我的意思是说 GL_LINEAR 与 GL_FRAMEBUFFER_SRGB 或任何其他亮度编码常数并不相反,因为 GL_LINEA,R TTBOMK 决定了插值。这听起来像是一个补充,但它不是,也不应该在这里相关。
  • 我记得他们是,看看here "如果pname​GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODINGparam​将包含组件的编码指定的附件,GL_LINEARGL_SRGB 之一,分别用于线性或 sRGB 编码组件。
  • 我看到它已经被重用了。很高兴知道,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多