加入混合抗锯齿线时浸渍

Mic*_*zic 9 algorithm graphics drawing antialiasing raster-graphics

我在使用混合模式时连接两个抗锯齿线时遇到问题,我在它们加入的点处进行了下降.通过混合模式,我的意思是我通过计算线颜色与背景颜色的比率来绘制我的抗锯齿线,因此当像素的比率例如是70%时,新像素是0.7*线颜色+ 0.3*背景颜色.我对行的抗锯齿功能基本上是由一个错误函数构成的(虽然我认为大多数抗锯齿函数都会产生同样的问题),如下所示:

0.5 + 0.5erf(-x)

因此,当两条线相遇时,一条线一条接一条,你会得到一个下降,两条线的关节下降到它应该达到的强度的75%,因为在那一点,50%的背景保留在第一条线上,然后,当剩下0%时,第二条线被抽出后,50%的50%仍然存在:

1  - (0.5erfc(-x)*0.5erfc(x))

我只能假设用连接线绘制抗锯齿光栅图形是一个常见问题,所以它必须有一个共同的解决方案,但我不知道这是什么.谢谢!

另外:为了清楚如何绘制线条,宽度上的线条是用高斯函数(e ^ -x*x)制作的,并且使用凸起的误差函数对两端进行四舍五入.您可以通过在WolframAlpha中输入'0.5erfc(-x-5)*0.5erfc(x-5)*e ^( - y*y)'来查看10 px长水平线的示例.

Mic*_*zic 0

最终我找到了这个问题的答案。没有明智的方法可以直接在主图像上直接绘制一条线,因为您不希望这些线混合在一起,而是希望将它们添加在一起,然后得到该线总和的结果混合到主图像中。

然而,如果您必须将所有这些线绘制到一个单独的缓冲区,然后将整个缓冲区混合到主缓冲区上,那就很麻烦了,这就是我在提出这个问题之前考虑并认为不合适而驳回的。值得庆幸的是,从那时起,我完全改变了我的方法,而不是使用一个缓冲区来一个又一个地绘制元素,而是使用每像素方法,其中每个像素是通过遍历要绘制的元素列表直接计算的,因为并行化(使用 OpenCL)。因此,我不必使用额外的缓冲区,而只需要一个可以容纳一些额外像素值的小数组,并且在要绘制的元素列表中,我有用作括号的元素,因此,例如,而不是具有:

image => (blend) line1 => (blend) line2 => (blend) line3

我可以有:

image => (blend) [0 => (add) line1 => (add) line2 => (add) line3]

这是通过为括号的每个深度级别设置一个值数组来替换单个像素值的使用来完成的,因此在这种情况下,v[0]您将拥有来自 的像素image,然后您将从v[1]0 开始并将每一行添加到它,当添加所有行时,括号的结束将被v[1]混合到其中v[0],并且正确的结果像素值将在那里。

就是这样,非常简单,如果您不允许自己使用相当于 Photoshop 中的一组图层的功能,那么这只是一个问题。