Android-高斯模糊效果-OpenGL

Android-高斯模糊效果-OpenGL,android,opengl-es,grafika,gaussianblur,Android,Opengl Es,Grafika,Gaussianblur,在未指定的地方,这个问题只是构建在github上找到的项目中的CameraCaptureActivity之上 它有一个内置的模糊效果,利用3x3内核 kernel = new float[] { 1f/16f, 2f/16f, 1f/16f, 2f/16f, 4f/16f, 2f/16f, 1f/16f, 2f/16f, 1f/16f }; 但是,这种模糊效果不够强,我正在寻找高斯效果在iOS上使用UIVisualEffectView可以实现的效果,它看起来像这样: 一

在未指定的地方,这个问题只是构建在github上找到的项目中的
CameraCaptureActivity
之上

它有一个内置的模糊效果,利用3x3内核

kernel = new float[] {
    1f/16f, 2f/16f, 1f/16f,
    2f/16f, 4f/16f, 2f/16f,
    1f/16f, 2f/16f, 1f/16f };
但是,这种模糊效果不够强,我正在寻找高斯效果在iOS上使用
UIVisualEffectView
可以实现的效果,它看起来像这样:

一个很好的平滑重模糊效果,但到目前为止,我管理的最好的是:

正如你所看到的,它并没有那么平滑,也有点方形

我通过将其转换为5x5内核来实现这一点,该内核使用sigma为30,内核大小为5。它产生以下结果:

kernel = new float[] {
    0.039911f,  0.039978f,  0.04f,      0.039978f,  0.039911f,
    0.039978f,  0.040044f,  0.040067f,  0.040044f,  0.039978f,
    0.04f,      0.040067f,  0.040089f,  0.040067f,  0.04f,
    0.039978f,  0.040044f,  0.040067f,  0.040044f,  0.039978f,
    0.039911f,  0.039978f,  0.04f,      0.039978f,  0.039911f
};
为了在
Grafika
项目中工作,我必须在
Texture2dProgram
类中修改
KERNEL\u SIZE
mTexOffset

KERNEL\u SIZE
现在是
25
mTextOffset
现在是这样计算的:

public void setTexSize(int width, int height) {

    float rw = 50.0f / width;
    float rh = 50.0f / height;

    float rw50 = rw * 0.5f;
    float rh50 = rh * 0.5f;

    mTexOffset = new float[] {
            -rw, -rh,   -rw50, -rh,     0f, -rh,    rw50, -rh,      rw, -rh,
            -rw, -rh50, -rw50, -rh50,   0f, -rh50,  rw50, -rh50,    rw, -rh50,
            -rw, 0f,    -rw50, 0f,      0f, 0f,     rw50, -0f,      rw, 0f,
            -rw, rh50,  -rw50, rh50,    0f, rh50,   rw50, rh50,     rw, rh50,
            -rw, rh,    -rw50, rh,      0f, rh,     rw50, rh,       rw, rh
    };
};

有没有人对我可以修改什么来实现像iOS一样的模糊(我认为iOS也可以使像素变亮)有什么建议?我认为我真正出错的地方是setTextSize()计算,特别是
50.0f
值,我刚刚从稀薄的空气中提取了这个值,并观察到它的效果,与实际模糊内核进行卷积是一项计算密集型任务,即使在GPU上也是如此。有几种技术可以使它工作得更好:

  • 高斯核可以分解为X和Y分量,分别计算。这种技术被图像处理程序使用,因为它相对快速和准确

  • 您可以使用泊松圆盘采样来模糊图像,而不是使用高斯核

  • 您可以使用多程Kawase滤波器作为高斯滤波器的近似值

  • 对于给定的主观模糊质量,从低分辨率mip贴图进行采样将获得更好的性能

  • 您可以从纹理之间采样,以劫持纹理插值,并获得比其他方式更多的点击


一旦您开始进行这些权衡,通常需要进行一些微调以使其“看起来正确”。(Filip S.,2014)提供了一个很好的总结。

与实际模糊内核进行卷积是一项计算密集型任务,即使在GPU上也是如此。有几种技术可以使它工作得更好:

  • 高斯核可以分解为X和Y分量,分别计算。这种技术被图像处理程序使用,因为它相对快速和准确

  • 您可以使用泊松圆盘采样来模糊图像,而不是使用高斯核

  • 您可以使用多程Kawase滤波器作为高斯滤波器的近似值

  • 对于给定的主观模糊质量,从低分辨率mip贴图进行采样将获得更好的性能

  • 您可以从纹理之间采样,以劫持纹理插值,并获得比其他方式更多的点击

一旦您开始进行这些权衡,通常需要进行一些微调以使其“看起来正确”。一份好的总结可在(Filip S.,2014)上查阅