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

How do I modify the SharpDX Gaussian Blur operation to not make the edges transparent?

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

这里是定义模糊的代码Class:

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 只是为了更宽的透明度边界。

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

 Owner.InterpolationMode = DXInterpolationMode.Fast;

如上所示,"Owner"是效果的DXSurface。它被分配给 DXResource 中的 surface 成员变量,它是链上几层的祖先,因此在此处更改它也会更改成员变量。

之前,设置为 HighQuality。使用 Pixel 设置也有效。