2016-09-26 25 views
0

我正在努力维护一个使用SharpDX进行图形操作的遗留代码。部分代码采用锯齿形图案,并使其模糊,从而为撕碎的纸张创建锯齿边缘效果。我们遇到了一个奇怪的错误,其中有一个微弱的白线围绕效果。通过代码,我发现显然模糊操作是在边缘周围创建一个小的透明边框。如何修改SharpDX高斯模糊操作以使边缘不透明?

Before blur After Blur

这里是用于定义模糊类别的代码:

public class DXEffectBlur : DXEffect 
{ 
    public DXEffectBlur(DXSurface Owner, DXImage Source0, float Sigma) 
     : base(Owner) 
    { 
     szPixels = Source0.SizePixels; 

     SharpDX.Direct2D1.Effects.GaussianBlur blur = new SharpDX.Direct2D1.Effects.GaussianBlur(surface.CurrentRender); 

     blur.StandardDeviation = Sigma; 
     blur.SetInput(0, Source0.Image, true); 
     blur.Optimization = GaussianBlurOptimization.Quality; 
     blur.BorderMode = BorderMode.Hard; 

     effect = blur; 
    } 
} 

的模糊被在下面的代码块援引为模糊写出到表面的作用:

using (SurfaceSupport ss = new SurfaceSupport(surface, ReadSource, true)) 
using (DXEffectBlur blur = new DXEffectBlur(surface, ss.Image, Sigma)) 
using (DXEffectUnPremultiply unmul = new DXEffectUnPremultiply(surface, blur)) 
using (DXLayer layer = new DXLayer(surface, rc, null, false, ss.Mask, 1F)) 
{ 
    surface.DrawImage(unmul, rc, 1F); 
} 

其中rc是覆盖我们表面的矩形,1F是不透明度。


有没有更好的方法来指定SharpDX中的模糊,使它不会使边缘半透明?我将继续关注代码,但我今天花了一个小时,并且我对SharpDX甚至DirectX都不熟悉,所以我会很感激任何关于在哪里寻找的指针。我已经尝试了边框模式,默认为Soft,但在模糊中设置为Hard,但Soft只是为了更宽的边框透明度。

回答

0

在同事的帮助下,我找到了解决方法。在构造函数中,我添加了以下行:

Owner.InterpolationMode = DXInterpolationMode.Fast; 

从上面可以看出,“所有者”是DXSurface的效果。它被分配到DXResource中的surface成员变量,这是一个链上几级的祖先,所以在这里更改它也会更改成员变量。

以前,设置为HighQuality。使用Pixel设置也可以。