我正在努力维护一段使用SharpDX进行图形操作的遗留代码。部分代码采用锯齿形图案并使其模糊,以便为撕碎的纸张创建锯齿状边缘效果。我们遇到了一个奇怪的错误,那里的效果周围有一条微弱的白线。单步执行代码,我发现模糊操作显然是在边缘周围创建一个小的透明边框。
以下是用于定义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只是为了提供更宽的透明边框。
答案 0 :(得分:0)
在同事的帮助下,我找到了解决方法。在构造函数中,我添加了以下行:
Owner.InterpolationMode = DXInterpolationMode.Fast;
如上所示,"所有者"是DXSurface的效果。它被分配到surface
中的DXResource
成员变量,它是链上的几个级别的祖先,因此在此处更改它也会更改成员变量。
以前,设置为HighQuality
。使用Pixel
设置也可以。