两个简易的SDF生成算法

Value的Improved Alpha-Tested Magnification for Vector Textures and Special Effects提到了可以利用SDF来渲染高质量的贴图的同时而不用提供很高精度的贴图。论文中提到用暴力法从高精度贴图生成SDF,没有直接提到其他的算法。暴力法在贴图大小较小,且spread较小时是可行的,随着贴图和spread大小的增加,效率将会降低,下面收集了两个比较容易实现的算法。

8SSEDT

8SSEDT即8-point signed sequential euclidean distance transform,Signed Distance Fields中给出了实现的伪代码。该算法的是个O(N)算法,与spread大小无关。通过对贴图进行从上到下、从下往上两遍扫描,最终可以得到一个distance transform。

该算法的缺点是无法使用CPU进行并行处理。

Marching Parabola

Distance Fields中提到了另一个算法,这个算法也是一个O(N)算法,但是相比8SSEDT的优点在于可以很容易利用CPU进行并行处理(一次并行处理多行或多列)。

对于输入贴图G中任何一点 x x x,其DT为

D T ( x ) = min ⁡ x ′ ∈ G { ( x − x ′ ) 2 + f ( x ′ ) } DT(x) = \min_{x' \in G}\{(x-x')^2 + f(x')\} DT(x)=xGmin{(xx)2+f(x)}

其中 f ( x ) f(x) f(x)为G中 x x x的cost,对于一个二值图像,通常定义为

f ( x ) = { 0 x ∈ O ∞ x ∉ O f(x) = \left\{\begin{matrix} 0 & x \in O \\ \infty & x \notin O \end{matrix}\right. f(x)={0xOx/O

其中 O O O为对象所在区域,容易看出 D T ( x ) DT(x) DT(x)就是平方距离。

对于点 x x x处的DT值,可以看成n个抛物线在 x x x处的值的最小值,这就是该算法与抛物线有关的原因。

你可能感兴趣的:(Graphics)