2

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

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

  1. 当程序注意到它将失去焦点时,捕获显示(或主纹理)的“平均”颜色。
  2. 当程序重新获得焦点时,使用步骤 1 中捕获的颜色执行非常快速的 glClearColor(r,g,b)。
  3. 然后,在用户看到步骤 2 中设置的颜色时,正常重新加载纹理。

我认为这将是一种视觉技巧,可以使闪烁不那么明显。有一个问题:我认为通过平均每个像素来捕获聚合颜色会花费太长时间并且不值得。

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

4

2 回答 2

8

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

于 2012-11-02T01:25:57.583 回答
2

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

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

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

于 2012-11-02T15:18:00.740 回答