0

我使用 Brad Larson 的 GPUImage 库。

GPUImageBulgeDistortionFilter 在图像上工作正常。但是 GPUImagePinchDistortion 过滤器在原始图像上以圆形切割呈现效果。这与原始图像不平滑融合。

任何人都可以提供解决方案吗?

捏合效果出现在切割的圆形区域中,而不是与原始图像平滑混合

好的,解决了..以下是最终的着色器,以获得捏合效果的平滑混合..

highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio));
 highp float dist = distance(center, textureCoordinateToUse);
 textureCoordinateToUse = textureCoordinate;

 if (dist < radius)
 {
     textureCoordinateToUse -= center;
     highp float percent = 1.0 + ((0.5 - dist) / 0.5) * scale;
     textureCoordinateToUse = textureCoordinateToUse * percent;
     textureCoordinateToUse += center;

     //modification start
     highp vec2 textureCoordinateDiff = textureCoordinate - textureCoordinateToUse;
     textureCoordinateToUse = textureCoordinateToUse + textureCoordinateDiff*(dist/radius);
     //modification end

     gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
 }
 else
 {
     gl_FragColor = texture2D(inputImageTexture, textureCoordinate );
 }
4

1 回答 1

2

收缩失真滤镜使用以下片段着色器:

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 uniform highp float aspectRatio;
 uniform highp vec2 center;
 uniform highp float radius;
 uniform highp float scale;

 void main()
 {
     highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio));
     highp float dist = distance(center, textureCoordinateToUse);
     textureCoordinateToUse = textureCoordinate;

     if (dist < radius)
     {
         textureCoordinateToUse -= center;
         highp float percent = 1.0 + ((0.5 - dist) / 0.5) * scale;
         textureCoordinateToUse = textureCoordinateToUse * percent;
         textureCoordinateToUse += center;

         gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
     }
     else
     {
         gl_FragColor = texture2D(inputImageTexture, textureCoordinate );
     }
 }

从中可以看出,从效果中心点到当前像素的距离小于效果半径时与大于该半径时之间存在明显的分界线。这导致失真区域和超出该区域的普通图像之间的边缘。

如果你想让它有更多的渐变效果,你可以用一个smoothstep()函数修改上面的内容,以更渐进地缓解扭曲区域和正常区域之间的边界。如果你这样做,我很乐意接受一个拉取请求。

于 2013-07-25T20:04:54.750 回答