如何实现自然模糊滤镜? (卷积核)

时间:2020-06-30 10:39:40

标签: opengl glsl convolution blur

当前,我正在Android中使用opengl实现模糊过滤器。 模糊过滤器是通过shadertoy站点实现的。 使用下面的源调整大小值以正确应用模糊。 enter image description here

但是,如果将该源应用到Android,那是因为您创建了很多texture2D 在某些手机上效果很好,但是在某些手机上fps下降很多。

因此,我将源代码更改为使用卷积内核,如下所示。 更改后,fps没有下降。 enter image description here

增加偏移值会稍微模糊,但是如果逐渐增加该值, 如图所示蔓延的现象出现。 使用卷积核如何使自然模糊像第一张图片一样工作?

在哪里可以调整模糊值?

1 个答案:

答案 0 :(得分:1)

模糊通过在略有不同的位置(重叠自身)显示相同的纹理来工作。他们的着色器可以做到这一点。您的着色器也可以。

但是要获得适当的模糊效果,您需要很多不同的位置-基本上每个像素距离要模糊一个。如果要模糊5个像素,则需要位置0、1、2、3、4和5。不仅仅是0和5,否则它看起来像纹理的两个重叠副本,而不像模糊。通常也会对它们进行加权,因此位置0最强,位置5最弱。

您也许可以跳过一些内容-也许您做0,1、3、5-但不能一直跳过到最后并期望它看起来不错。

您的代码仅在-5以及0和5位置显示纹理(但以2D显示,因此实际上是-5,-5和-5,0和-5,5以及0,-5和0,0和0,5和5,-5和5,0和5,5),但不是所有的中间值。这就是为什么您的结果看起来像9个重叠的纹理副本,而不是模糊的原因。

为了说明起见,

5个像素是虚数。在您的实际图片中,水平大约20像素,垂直大约10像素。

要获得模糊效果,您需要对所有中间点进行采样。这意味着您需要多次使用Texture2D 9次以上。原来的着色器做了哪些,而新的着色器没有。


现在,高斯模糊是可分离的模糊功能。这意味着有一个非常简单的技巧可以使其快速运行。如果要进行高斯模糊处理,则只需执行垂直高斯模糊处理,保存该图片,然后再进行水平高斯模糊处理(或者您可以先进行水平模糊处理,这都没有关系)。这样,如果您想要20像素的模糊,则只需采样20次,然后再采样20次,而不是400次。

相关问题