如何修改SharpDX高斯模糊操作以使边缘不透明?

时间:2016-09-26 17:48:45

标签: c# directx sharpdx gaussianblur

我正在努力维护一段使用SharpDX进行图形操作的遗留代码。部分代码采用锯齿形图案并使其模糊,以便为撕碎的纸张创建锯齿状边缘效果。我们遇到了一个奇怪的错误,那里的效果周围有一条微弱的白线。单步执行代码,我发现模糊操作显然是在边缘周围创建一个小的透明边框。

Before blur After Blur

以下是用于定义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;
    }
}

在以下代码块中将模糊调用为 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,所以我要感谢任何关于在哪里寻找的指针。我已经尝试过使用BorderMode,默认为Soft,但在模糊中设置为Hard,但Soft只是为了提供更宽的透明边框。

1 个答案:

答案 0 :(得分:0)

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

 Owner.InterpolationMode = DXInterpolationMode.Fast;

如上所示,"所有者"是DXSurface的效果。它被分配到surface中的DXResource成员变量,它是链上的几个级别的祖先,因此在此处更改它也会更改成员变量。

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