Substance Designer 中實現形態圖形處理演算法(II) --- 非均勻的腐蝕拓展


回顧&改進

在前文中描述的腐蝕運算大家都沒有忘記吧? 雖然這種腐蝕在處理二值圖像(比如, 剛從edge detect得到的乾淨的邊緣)比較方便, 但是缺點就是由於使用的模板是3x3的方盒, 如圖

由於運算的局部性, 腐蝕結果會顯得"方頭方腦", 沒有實際使用價值(除非你認為世界上有這種鬼畜的腐蝕現象):

而且, 不僅希望抑制這種副作用, 我們往往希望能夠僅在一些想要的地方施加較強的腐蝕效果, 而在其餘的地方採用較弱的腐蝕效果. 我這裡有一個解決思路, 結果還不錯:

也可以支持模板遮蓋:


原理&Code

我把改進後的腐蝕稱為nonuniform erosion; 基本代碼如圖:

sbs graph, 3個輸入: 要腐蝕的原圖, 腐蝕強度圖, 以及遮罩. 主要節點為pixel processor, 見下圖

pixel processor

不懂編程的讀者可能不太懂, 我在這裡簡略解釋這張圖的一些元素:

$pos, $size是SD自帶的系統常量, 分別表示像素位置和圖像長寬; min表示取得輸入值中的最小值; sample節點負責在指定的輸入圖(比如input0, 就是輸入的第一張圖)在輸入的位置(比如$pos)處提取顏色.

這裡的思路其實還是非常簡單, 無非就是額外加了2張圖(strength + mask), 用第一張strength圖對原圖做類似卷積的操作(相同位置像素灰度值相乘), 然後用Mask為Alpha做線性插值.不知道線性插值定義的話可以看下面的公式:

LinearInterpolation(x, y, a) = (1 - a) 	imes x + a 	imes y

其中a就是Mask的當前位置像素值, x, y分別為原圖和Strength輸入圖.

經過試驗, 感覺這個節點還是不太符合我的期望, 但用還是可以用了:

Strength控制強度和腐蝕的圖案, Mask可以起到一定的遮罩效果;

實驗效果


由於目前Erosion的開發還沒有完全完成, 所以就不把沒成熟的東西拿出來了; 接下來打算增加帶方向性的腐蝕, 和調整腐蝕形狀結構的2個功能;

同時把SubstanceDesigner中最常用的, 也是CG中最知名的噪音PerlinNoise在SubstanceDesigner的2種不同實現辦法(2D/3D)順便也介紹一下, 如果還有時間的話, 把我目前所完成的最複雜的SD節點: Canny Edge Detect也給寫了吧.

精度較高的邊緣檢測器CannyEdgeDetect


推薦閱讀:

TAG:遊戲美術設計 | 計算機圖形學 | 技術美術 |