2016-09-26 68 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設置也可以。