我如何修改GPUImageGaussianSelectBlurFilter在矩形而不是圆上操作?

我已经使用了GPUImage框架来模拟类似于Instagram应用程序的模糊效果,在这个模式下,我已经为从图片库中获取图片做了一个观察,然后对它作了一个效果。

其中一个影响是select性模糊效果,其中只有一小部分图像清晰,其余部分模糊。 GPUImageGaussianSelectiveBlurFilterselect图像的圆形部分不被模糊。

我怎样才能改变这一点,使锐利的区域形状是矩形?

因为吉尔的回答并不完全正确,而且由于这似乎一遍又一遍地被问到,我会在上面澄清我的评论。

默认情况下select性模糊的片段着色器具有以下代码:

varying highp vec2 textureCoordinate; varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; uniform lowp float excludeCircleRadius; uniform lowp vec2 excludeCirclePoint; uniform lowp float excludeBlurSize; uniform highp float aspectRatio; void main() { lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); highp vec2 textureCoordinateToUse = vec2(textureCoordinate2.x, (textureCoordinate2.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); highp float distanceFromCenter = distance(excludeCirclePoint, textureCoordinateToUse); gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, distanceFromCenter)); } 

该片段着色器从原始清晰图像和图像的高斯模糊版本中获取像素颜色值。 然后根据最后三行的逻辑进行混合。

第一行和第二行计算从指定的中心坐标(默认情况下为标准化坐标((0.5,0.5)到图像死点的距离)到当前像素坐标的距离。 最后一行使用smoothstep() GLSL函数在距离中心点的距离在两个阈值之间行进时,在0和1之间平滑插值,内部清晰圆圈和外部完全模糊圆圈。 mix()运算符然后从smoothstep()获取输出,并在模糊和尖锐的颜色像素颜色之间淡出以产生适当的输出。

如果你只是想修改这个来产生一个正方形的形状而不是圆形的,那么你需要调整片段着色器中的两条中心线,以X或Y坐标为线性的距离,而不是距离中心点的毕达哥拉斯(Pythagorean)距离。 为此,将着色器更改为:

  varying highp vec2 textureCoordinate; varying highp vec2 textureCoordinate2; uniform sampler2D inputImageTexture; uniform sampler2D inputImageTexture2; uniform lowp float excludeCircleRadius; uniform lowp vec2 excludeCirclePoint; uniform lowp float excludeBlurSize; uniform highp float aspectRatio; void main() { lowp vec4 sharpImageColor = texture2D(inputImageTexture, textureCoordinate); lowp vec4 blurredImageColor = texture2D(inputImageTexture2, textureCoordinate2); highp vec2 textureCoordinateToUse = vec2(textureCoordinate2.x, (textureCoordinate2.y * aspectRatio + 0.5 - 0.5 * aspectRatio)); textureCoordinateToUse = abs(excludeCirclePoint - textureCoordinateToUse); highp float distanceFromCenter = max(textureCoordinateToUse.x, textureCoordinateToUse.y); gl_FragColor = mix(sharpImageColor, blurredImageColor, smoothstep(excludeCircleRadius - excludeBlurSize, excludeCircleRadius, distanceFromCenter)); } 

Gill提到的线只是滤波器的input参数,根本不能控制它的圆度。

我进一步修改这个以产生一个通用的矩形形状作为读者的练习,但是这应该为你如何做到这一点提供了一个基础,并且对这个着色器中的线条做了更多的解释。

是否…矩形效果的代码只是在这两行

 blurFilter = [[GPUImageGaussianSelectiveBlurFilter alloc] init]; [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setExcludeCircleRadius:80.0/320.0]; [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setExcludeCirclePoint:CGPointMake(0.5f, 0.5f)]; // [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setBlurSize:0.0f]; [(GPUImageGaussianSelectiveBlurFilter*)blurFilter setAspectRatio:0.0f];