在OpenGL中计算平均场景亮度

时间:2015-08-21 19:43:23

标签: opengl framebuffer brightness

我目前正在实施自动调整曝光以在OpenGL中使用HDR。为此,我需要检索前一帧中所有像素的平均亮度。

我没有找到任何有关如何执行此操作的可靠解释。据我所知,有两种方法可以实现。

  1. 使用glReadPixels将帧缓冲区复制到内存并在CPU上平均它们。这可能会非常缓慢,并且无法充分利用GPU。
  2. 使用线性过滤拍摄帧并将其渲染为连续较小的FBO。这让GPU可以完成大部分工作,但是需要大量的FBO(1080p屏幕大约需要10个)。
  3. 必须有更好的方法来获得平均场景亮度。有没有人有任何建议?

2 个答案:

答案 0 :(得分:2)

您的选项2与在纹理上使用glGenerateMipmap没有太大区别,只是您不需要像FBO那样麻烦任何客户端对象。所以基本上,渲染到纹理的mipmap级别0,让GL生成mipmap金字塔,并且回读最高级别的1x1图像可能是获得平均颜色值的一些近似的最简单方法。

答案 1 :(得分:2)

我想到了两个选项:

  • 使用glGenerateMipmap计算2x2窗口的平均值,让您获得最小级别的平均场景亮度。这可以使用着色器中的textureLod函数进行检索。由于每个mipmap级别的大小都是前一级别的一半,因此正确级别为log2(max),其中max是GL_MAX_TEXTURE_SIZE的返回值。
  • 使用计算着色器基本上与glGenerateMipmap相同,但窗口大小更大,可能更快(尽管我从未测试过这个)。