兩個簡易的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中任何一點xx,其DT爲

DT(x)=minxG{(xx)2+f(x)} DT(x) = \min_{x' \in G}\{(x-x')^2 + f(x')\}

其中f(x)f(x)爲G中xx的cost,對於一個二值圖像,通常定義爲

f(x)={0xOxO f(x) = \left\{\begin{matrix} 0 & x \in O \\ \infty & x \notin O \end{matrix}\right.

其中OO爲對象所在區域,容易看出DT(x)DT(x)就是平方距離。

對於點xx處的DT值,可以看成n個拋物線在xx處的值的最小值,這就是該算法與拋物線有關的原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章