OpenGL渐变"条带"工件

Blu*_*pud 8 opengl

最近我一直试图清理我的openGl渲染.我现在已经有这些文物了一段时间,但从来没有真正考虑过它.这是一个屏幕截图: 在此输入图像描述

在此输入图像描述 经过一番研究后,我无法弄清楚它有什么问题.我在OSX上使用OpenGl,但我在其他系统上尝试过,并且会出现相同的工件.

dat*_*olf 6

您所体验的是每通道色彩空间8位的有限动态范围.简单的灰度梯度,即每通道8比特帧缓冲器上的R = B = G,可以仅具有2 ^ 8 = 256个不同的值.如果您在较大区域内的类似值(如图片中)之间进行转换,则结果是低动态范围条带.

克服这个问题的唯一方法是用更大的位数计算梯度.为了在低动态范围屏幕上显示图像,您可以使用抖动.

  • @BlueSpud:创建渐变,光照或显式渐变无关紧要.如果每个通道只有8位,则只能解析256个灰度.要使用的抖动方法不是由OpenGL规范指定的,并且可能仅产生局部效果.此外,空抖动算法(即实现没有抖动支持)完全有效. (2认同)
  • @BlueSpud:启用 GL_DITHER 只会启用所使用的 OpenGL 实现中内置的抖动算法。这很可能是零抖动(即无抖动)或局部抖动。OpenGL 不提供更改由 GL_DITHER 开关控制的阶段使用的抖动算法的方法。然而,完全有可能渲染成具有高动态范围颜色附件的 FBO(需要 12 位来覆盖人类视觉灰度动态范围)。然后在后处理中,您可以使用片段着色器来实现抖动,以生成 HDR 图像生成 LDR 输出。 (2认同)
  • @BlueSpud:我建议你专门打开另一个问题:"如何使用OpenGL实现后处理抖动?" 这使问题特定于专题主题并使其更易于搜索.在StackOverflow上已经多次使用FBO渲染到纹理. (2认同)