任何快速获取“;平均值”;OpenGL纹理或渲染缓冲区的颜色?

任何快速获取“;平均值”;OpenGL纹理或渲染缓冲区的颜色?,opengl,Opengl,我在一个操作系统上有一个OpenGl应用程序,当应用程序失去焦点时,即使应用程序仍保留在内存中,它也能抓取OpenGl上下文。当应用程序返回焦点时,当我将纹理重新加载到新的OpenGL上下文中时,这会导致屏幕闪烁 我正在将重新加载分解为增量,以便看起来更好。但我也想知道这种可能性: 当程序收到将失去焦点的通知时,捕获显示的“平均”颜色(或主纹理) 当程序重新聚焦时,使用步骤1中捕获的颜色快速执行glClearColor(r、g、b) 然后,在用户看到步骤2中设置的颜色时,正常地重新加载纹理 我认

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

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

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


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

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

    听起来您需要一个直方图。GPU gems有一篇文章介绍了如何使用几何体着色器制作几何体


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

    mipmap生成可能会比其他任何方法都要快。不过,在我将其视为事实之前,我会针对其他一些解决方案进行测试。请注意,如果0级纹理的非二次方大小,则某些OpenGL实现(如Mesa,请参阅)会生成严重锯齿的mipmap。在这种情况下,最深的mip级别将远离级别0的平均颜色。对于这种情况,您可能希望使用texel填充数据以填充两个纹理的幂(实际数据维度的四舍五入),然后将最深mip级别的值缩放为
    avg=deepestMipTexel*(roundedWidth*roundedHeight)/(dataWidth*dataHeight)
    链接断开。以下是工作链接: