【问题标题】:10-bit alternative to GL_SRGB_ALPHA?GL_SRGB_ALPHA 的 10 位替代品?
【发布时间】:2019-09-21 10:45:10
【问题描述】:

我们目前正在使用 GL_SRGB8_ALPHA8 进行 FBO 颜色校正,但它会在较暗的场景中导致明显的色带。

是否有每个颜色通道具有 10 位的 GL_SRGB8_ALPHA8 版本(例如 GL_RGB10_A2)?如果没有,此用例有哪些解决方法?

附加的图像已添加对比度以使其更明显,但在源中仍然很明显。

【问题讨论】:

  • 这取决于您在做什么(并且您没有在问题中指定)。对于 10 位,您需要一个 10 位的视频卡。对于视频渲染,使用浮点数,但不是实时渲染,也不是在您自己的计算机上制作。
  • 你是如何使用它的?您说“用于 FBO 颜色校正”。这是否意味着您已经将场景渲染为正常的 8 位纹理,而现在您正在将颜色校正作为单独的步骤进行?
  • @immibis 我对讨论很感兴趣,但不确定问题 cmets 是否适合这个问题。 AFAIU 色带问题与 SRGB 没有直接关系。这是我们必须在所有 8 位/组件显示器上遭受的痛苦吗?即使我们在 FBO 中有 16 位的内部精度,在将图片传输到物理监视器时也会丢失。
  • @AntonDuzenko 我问是因为我尝试通过从 8 位线性缓冲区开始进行颜色校正,然后将其转换为 sRGB。与 sRGB 相比,8 位线性缓冲区对于较暗的颜色根本没有足够的精度,如果您这样做,除非您直接渲染到 sRGB,或者增加位深度,否则条带是不可避免的,或者使用浮点线性缓冲区。
  • @immibis 如果我在这里错了,请纠正我。让我们同意 SRGB FBO 可以为较深的颜色提供更好的精度。假设线性色彩空间允许 0、1、2、3...255 的等级。假设非线性色彩空间可以做例如0、0.3、0.6、0.9 等。这一切都很好并且工作。但最后我需要将这个高精度的帧图片呈现给 DWM/Monitor。当我通过出色的内部帧缓冲区转换为实际发送到视频卡输出的颜色缓冲区时,这种精度会丢失,我错了吗?不,例如HDMI输出处理线性空间? (与原始问题无关)

标签: opengl fbo hdr srgb


【解决方案1】:

从表面上看,Direct3D 9 似乎支持这一点,因为它不将 sRGB 编码为格式。相反,它将采样器设置为解码为线性空间,因此我看不出它在 D3D9 上如何无法正常工作,否则纹理将被错误地过滤。我不知道它是如何实现的。即使使用 GL_EXT_texture_sRGB_decode,也决定(有一个注释)不启用这种 D3D9 类行为。

像往常一样,OpenGL 似乎总是在追逐这个现在旧 API 的幽灵。它可能只有 D3DSAMP_SRGBTEXTURE 之类的东西,并且与它具有同等地位。大概是硬件实现了它。任何条带都可能取决于显示器,因为最终它必须向下转换为显示器的颜色深度,这可能远低于 10 位。

【讨论】:

    【解决方案2】:

    最后我们得到了线性 16 位浮点格式 我怀疑驱动程序在内部将它用于 SRGB 无论如何,正如@mick-p 所说,我们总是受限于显示颜色深度

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 1970-01-01
      • 2017-04-14
      • 2017-11-17
      • 2011-11-19
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多