获得OpenGL纹理或渲染缓冲区的“平均”颜色的任何快速方法?

时间:2012-11-02 01:03:45

标签: opengl

我在操作系统上有一个OpenGl应用程序,可以在应用程序失去焦点时抓取OpenGL上下文,即使应用程序仍在内存中。当应用程序返回焦点时,当我将纹理重新加载到新的OpenGL上下文时,这会导致屏幕闪烁。

我正在努力将重新加载分解为增量,以便它看起来更好。但我也想知道这种可能性:

  1. 当程序发现它将失去焦点时,捕获显示器(或主要纹理)的“平均”颜色。
  2. 当程序重新获得焦点时,请使用步骤1中捕获的颜色快速执行glClearColor(r,g,b)。
  3. 然后,在用户看到步骤2中设置的颜色时,正常重新加载纹理。
  4. 我认为这将是一种视觉技巧,使闪烁不那么明显。有一个问题:我认为通过平均每个像素来捕获聚合颜色需要花费太长时间而且不值得。

    所以我想知道是否有任何OpenGl技巧可以让应用程序粗略估计用户在屏幕上看到的平均颜色?

2 个答案:

答案 0 :(得分:6)

我听说过平均屏幕颜色的最快方法是将其复制到纹理,调用glGenerateMipmap,然后抓住最小的图层(1x1 mip级别),这将是包含像素的平均颜色。但这对我来说听起来并不是特别快,所以不确定它是否对你的目的有帮助。

答案 1 :(得分:1)

听起来你需要一个直方图。 GPU gems有一篇文章,其中包含使用几何着色器制作一个的描述。

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch41.html

Nicol的方法或变体可能会更快(当然代码更少)但不太容易调整。